├── dumps ├── .gitignore ├── _sites │ ├── __init__.py │ ├── chicane-f1.py │ └── second-a-lap.py ├── chicane-f1 │ ├── .gitignore │ ├── csv │ │ └── .gitignore │ └── chicane-results.ods ├── second-a-lap │ ├── .gitignore │ └── csv │ │ └── .gitignore ├── dump.py ├── chicane-f1.py ├── table2csv.py ├── chicane-f1-nc.py └── compile.py ├── f1elo ├── __init__.py ├── db.py ├── elo.py ├── interface.py └── model.py ├── charts └── .gitignore ├── .gitignore ├── config ├── .gitignore ├── db.json.SQLITE-EXAMPLE ├── db.json.MYSQL-EXAMPLE └── elo.json ├── doc ├── sources.md ├── ideas.txt ├── races.md ├── results.md ├── sql.md └── challenges.md ├── podiums.py ├── import-csv.py ├── charts.sh ├── elo.py ├── sql ├── views.sql └── championship.sql ├── README.md └── charts.py /dumps/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /f1elo/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /charts/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /dumps/_sites/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | *.db 3 | -------------------------------------------------------------------------------- /config/.gitignore: -------------------------------------------------------------------------------- 1 | db.json 2 | -------------------------------------------------------------------------------- /dumps/chicane-f1/.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | -------------------------------------------------------------------------------- /dumps/chicane-f1/csv/.gitignore: -------------------------------------------------------------------------------- 1 | *.csv 2 | -------------------------------------------------------------------------------- /dumps/second-a-lap/.gitignore: -------------------------------------------------------------------------------- 1 | *.txt 2 | -------------------------------------------------------------------------------- /dumps/second-a-lap/csv/.gitignore: -------------------------------------------------------------------------------- 1 | *.csv 2 | -------------------------------------------------------------------------------- /config/db.json.SQLITE-EXAMPLE: -------------------------------------------------------------------------------- 1 | { 2 | "engine": "sqlite", 3 | "file": "elo.db" 4 | } 5 | -------------------------------------------------------------------------------- /dumps/chicane-f1/chicane-results.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/emkael/elof1/HEAD/dumps/chicane-f1/chicane-results.ods -------------------------------------------------------------------------------- /config/db.json.MYSQL-EXAMPLE: -------------------------------------------------------------------------------- 1 | { 2 | "engine": "mysql", 3 | "user": "USER", 4 | "pass": "PASS", 5 | "db": "DATABASE", 6 | "host": "HOST" 7 | } 8 | -------------------------------------------------------------------------------- /config/elo.json: -------------------------------------------------------------------------------- 1 | { 2 | "initial_ranking": 2000.0, 3 | "disparity": { 4 | "base_disparity": 400, 5 | "adjust": 1, 6 | "base_rating_change": 150 7 | }, 8 | "importance": { 9 | "NC_Q": 1.6, 10 | "NC_R": 16, 11 | "C_Q": 3.2, 12 | "C_R": 32 13 | }, 14 | "importance_threshold": [ 2000, 1800 ] 15 | } 16 | -------------------------------------------------------------------------------- /dumps/_sites/chicane-f1.py: -------------------------------------------------------------------------------- 1 | import urllib 2 | import urllib2 3 | import urlparse 4 | 5 | from lxml import html 6 | 7 | def fetch(url): 8 | contents = urllib2.urlopen(url).read() 9 | tree = html.fromstring(contents) 10 | title = tree.xpath("//h1")[0].text + ' - ' + tree.xpath('//span[@class="subtitle"]')[0].text 11 | tables = tree.xpath("//table[@cellpadding=6]") 12 | print url 13 | print title 14 | return title, tables 15 | -------------------------------------------------------------------------------- /doc/sources.md: -------------------------------------------------------------------------------- 1 | Data sources: 2 | ============= 3 | 4 | Championship races: 5 | ------------------- 6 | 7 | 1950-1951 - wikipedia 8 | 9 | 1952-1953 - second-a-lap.blogspot.com 10 | 11 | 1954+ - ergast.com/mrd 12 | 13 | Non-championship races: 14 | ----------------------- 15 | 1950+ - www.silhouet.com/motorsport/archive/f1 16 | 17 | 1952-1953 - second-a-lap.blogspot.com 18 | 19 | 1954+ - chicanef1.com 20 | 21 | Qualifying: 22 | ----------- 23 | 2003+ - ergast.com/mrd 24 | 25 | 1954+ - chicanef1.com 26 | -------------------------------------------------------------------------------- /podiums.py: -------------------------------------------------------------------------------- 1 | import csv 2 | 3 | output = csv.writer(open('charts/podium-averages.csv', 'w')) 4 | 5 | output.writerow(['race','podium_sum','podium_sum_after','grid_average','average_change','podium_to_average','podium_to_average_per_driver','average_change_to_grid_average']) 6 | 7 | for line in csv.reader(open('charts/rate.csv')): 8 | name = '-'.join(line[:-4]) 9 | values = map(float, line[-4:]) 10 | values.append(values[0] / values[2]) 11 | values.append(values[4] / 3) 12 | values.append(values[3] / values[2] * 100) 13 | values[:0] = [name] 14 | output.writerow(values) 15 | -------------------------------------------------------------------------------- /dumps/_sites/second-a-lap.py: -------------------------------------------------------------------------------- 1 | import json 2 | import urllib 3 | import urllib2 4 | import urlparse 5 | 6 | from lxml import html 7 | 8 | def fetch(url): 9 | url = urlparse.urlparse(url).path 10 | contents = json.loads(urllib2.urlopen('http://second-a-lap.blogspot.com/feeds/posts/default?' + 11 | urllib.urlencode({'alt': 'json', 'v': 2, 'dynamicviews': 1, 'path': url})).read()) 12 | title = contents['feed']['entry'][0]['title']['$t'] 13 | text = contents['feed']['entry'][0]['content']['$t'] 14 | tree = html.fromstring(text) 15 | tables = tree.xpath("//table[@bordercolor]") 16 | print url 17 | print title 18 | return title, tables 19 | -------------------------------------------------------------------------------- /dumps/dump.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | from sys import argv 4 | from compile import compile 5 | from table2csv import convert 6 | 7 | if __name__ == "__main__": 8 | if len(argv) > 1: 9 | if argv[1] == 'compile': 10 | compile(argv[2:]) 11 | elif len(argv) > 2: 12 | if argv[1] == 'fetch': 13 | argv.remove('fetch') 14 | fetch = __import__('_sites.' + argv[1], globals(), locals(), ['fetch']) 15 | for url in argv[2:]: 16 | title, tables = fetch.fetch(url) 17 | i = 1 18 | for table in tables: 19 | convert(table, title + '-' + str(i), argv[1]) 20 | i += 1 21 | -------------------------------------------------------------------------------- /f1elo/db.py: -------------------------------------------------------------------------------- 1 | import json 2 | from os import path 3 | 4 | import __main__ 5 | from sqlalchemy import create_engine, event 6 | from sqlalchemy.orm import sessionmaker 7 | 8 | config = json.load( 9 | open(path.join(path.dirname(__main__.__file__), 'config', 'db.json'))) 10 | if config['engine'] == 'mysql': 11 | engine = create_engine( 12 | "mysql://{0[user]}:{0[pass]}@{0[host]}/{0[db]}?charset=utf8".format( 13 | config)) 14 | elif config['engine'] == 'sqlite': 15 | engine = create_engine("sqlite:///{0[file]}".format(config)) 16 | 17 | def fk_pragma(conn, record): 18 | conn.execute('PRAGMA FOREIGN_KEYS=ON') 19 | 20 | event.listen(engine, 'connect', fk_pragma) 21 | 22 | Session = sessionmaker(bind=engine) 23 | -------------------------------------------------------------------------------- /doc/ideas.txt: -------------------------------------------------------------------------------- 1 | Tables: 2 | + all-time peak ratings 3 | + top exit ratings (date < 2014) 4 | + peak rating progression 5 | + year-by-year top peak/average ratings 6 | + highest/lowest ranked podiums 7 | + races with biggest changes 8 | + highest rating at the end of rookie season (= first season with at least 7 sessions) / highest average rating over rookie season 9 | Charts: 10 | + rolling average and deviation of rankings (average of averages groupped by driver) 11 | + average ranking at the beginning and the end of each championship season (first and last championship races) 12 | + peak season ranking (MAX peak rating, MIN bottom rating, AVG average, STDDEV average GROUP BY YEAR(date), _driver) 13 | + top 3 of every season (on average) by half-decade 14 | -------------------------------------------------------------------------------- /dumps/chicane-f1.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import urllib 3 | import urllib2 4 | import urlparse 5 | 6 | from lxml import html 7 | 8 | for year in range(1954,2015): 9 | url = 'http://chicanef1.com/calendar.pl?' + urllib.urlencode({'year':year,'nc':0}) 10 | contents = urllib2.urlopen(url).read() 11 | tree = html.fromstring(contents) 12 | links = tree.xpath('//table[@cellpadding=6]//tr/td[1]//a') 13 | for link in links: 14 | url = urlparse.urlparse(link.attrib['href']) 15 | url = url._replace(path='race.pl') 16 | query = dict(urlparse.parse_qsl(url.query)) 17 | for type in ['qual', 'preq']: 18 | query['type'] = type 19 | url = url._replace(query=urllib.urlencode(query)) 20 | print urlparse.urljoin('http://chicanef1.com', urlparse.urlunparse(url)) 21 | -------------------------------------------------------------------------------- /dumps/table2csv.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import os 3 | import re 4 | import string 5 | 6 | from lxml import etree 7 | from bs4 import BeautifulSoup 8 | 9 | def convert(table, title, output_dir): 10 | name = "".join(x for x in title if x.isalnum()) 11 | print name 12 | path = open(os.path.join(output_dir, name + '.txt'), 'w') 13 | table = etree.tostring(table) 14 | print >>path, table 15 | csv_file = csv.writer( 16 | open(os.path.join(output_dir, 'csv', name + '.csv'), 'w')) 17 | soup = BeautifulSoup(table) 18 | for row in soup.find_all('tr'): 19 | row = map( 20 | lambda t: re.sub('\s+', 21 | ' ', 22 | " ".join(t.stripped_strings)).encode('utf-8'), 23 | row.find_all(re.compile('t[dh]'))) 24 | csv_file.writerow(row) 25 | 26 | -------------------------------------------------------------------------------- /import-csv.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import sys 3 | 4 | from f1elo.db import Session 5 | from f1elo.model import * 6 | 7 | session = Session() 8 | 9 | with open(sys.argv[1]) as f: 10 | reader = csv.reader(f) 11 | for row in reader: 12 | driver = None 13 | if len(row) == 6: 14 | entry = Entry() 15 | entry._race = row[0] 16 | entry.result = row[1] 17 | entry.car_no = row[2] 18 | entry.result_group = row[5] 19 | session.add(entry) 20 | driver = Driver.fetch(row[4].strip(), row[3].strip(), session) 21 | entry.drivers.append(driver) 22 | elif len(row) == 2: 23 | driver = Driver.fetch(row[1].strip(), row[0].strip(), session) 24 | entry.drivers.append(driver) 25 | else: 26 | print row 27 | 28 | session.commit() 29 | -------------------------------------------------------------------------------- /charts.sh: -------------------------------------------------------------------------------- 1 | python charts.py 2 | grep -v '^#' rate.log | grep -v '^$' | paste -s -d ',,,\n' | grep -f charts/championship-races.csv | sed 's/\(Average\|Podium\) rating\( change\)\?: *//g' | sed 's/\([0-9]\) \([0-9]\)/\1,\2/g' > charts/rate.csv 3 | python podiums.py 4 | rm charts/rate.csv 5 | cat charts/podium-averages.csv | sort --field-separator=',' --key=7 -r | head -n 21 > charts/strongest_podiums.csv 6 | cat charts/podium-averages.csv | head -n 1 > charts/weakest_podiums.csv 7 | cat charts/podium-averages.csv | sort --field-separator=',' --key=7 | tail -n+2 | head -n 20 >> charts/weakest_podiums.csv 8 | cat charts/podium-averages.csv | sort --field-separator=',' --key=8 -r | head -n 21 > charts/biggest_shuffles.csv 9 | cat charts/podium-averages.csv | head -n 1 > charts/smallest_shuffles.csv 10 | cat charts/podium-averages.csv | sort --field-separator=',' --key=8 | head -n 20 >> charts/smallest_shuffles.csv 11 | -------------------------------------------------------------------------------- /dumps/chicane-f1-nc.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import urllib 3 | import urllib2 4 | import urlparse 5 | 6 | from lxml import html 7 | 8 | for year in range(1954,2015): 9 | url = 'http://chicanef1.com/calendar.pl?' + urllib.urlencode({'year':year,'nc':1}) 10 | contents = urllib2.urlopen(url).read() 11 | tree = html.fromstring(contents) 12 | links = tree.xpath('//table[@cellpadding=6]//tr/td[2]/center[text()="Non-championship"]/../..//td[1]//a') 13 | for link in links: 14 | url = urlparse.urlparse(link.attrib['href']) 15 | url = url._replace(path='race.pl') 16 | query = dict(urlparse.parse_qsl(url.query)) 17 | for type in ['h1q', 'heat1', 'heat2', 'agg', 'final', 'qual', 'res']: 18 | query['type'] = type 19 | url = url._replace(query=urllib.urlencode(query)) 20 | print urlparse.urljoin('http://chicanef1.com', urlparse.urlunparse(url)) 21 | -------------------------------------------------------------------------------- /dumps/compile.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import csv 4 | import string 5 | from sys import argv 6 | 7 | def compile(files): 8 | headers = set() 9 | values = [] 10 | writer = csv.writer(open('races.csv', 'w')) 11 | race_id = 0 12 | for path in files: 13 | try: 14 | with open(path, 'r') as csvfile: 15 | reader = csv.reader(csvfile) 16 | header = next(reader) 17 | headers = set(headers | set(header)) 18 | for row in reader: 19 | data = {} 20 | i = 0 21 | for cell in row: 22 | data[header[i]] = cell 23 | data['Race'] = race_id 24 | i += 1 25 | values.append(data) 26 | writer.writerow([race_id, path, '', '', '']) 27 | race_id += 1 28 | except IOError: 29 | pass 30 | headers.add('Race') 31 | writer = csv.writer(open('compiled.csv', 'w')) 32 | writer.writerow(list(headers)) 33 | for row in values: 34 | csvrow = [] 35 | for name in headers: 36 | if name in row: 37 | csvrow.append(row[name]) 38 | else: 39 | csvrow.append('') 40 | writer.writerow(csvrow) 41 | 42 | -------------------------------------------------------------------------------- /elo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import argparse 3 | import sys 4 | 5 | import dateutil.parser 6 | from f1elo.interface import Interface 7 | 8 | parser = argparse.ArgumentParser( 9 | description='Ranks Formula One drivers using Elo rating', 10 | formatter_class=argparse.RawTextHelpFormatter) 11 | parser.add_argument('command', metavar='COMMAND', nargs='?', 12 | help="Action to execute against the database:\n" 13 | "print - prints the rankings for all drivers ranked " 14 | "in 12 months,\n" 15 | "reset - resets the rankings,\n" 16 | "rate - calculates the rankings\n" 17 | "init - init clean database for the application\n" 18 | "Default value is 'print'.", 19 | default='print', 20 | choices=['print', 'rate', 'reset', 'init']) 21 | parser.add_argument('--date', 22 | help='Date for which the action should be executed.\n' 23 | 'Print ratings for DATE,\n' 24 | 'reset ratings all the way down to DATE\n' 25 | 'or rank the races all the way up to DATE.') 26 | parser.add_argument( 27 | '--limit', 28 | help='Ranking list (display) cut-off point.', 29 | type=int) 30 | parser.add_argument( 31 | '-v', 32 | help='Display verbose info on rating progress to STDERR.', 33 | action='store_true') 34 | parser.add_argument( 35 | '--force', 36 | '-f', 37 | help='Force database initialization (for "init" command).', 38 | action='store_true') 39 | 40 | arguments = parser.parse_args() 41 | 42 | command = arguments.command.lower() 43 | 44 | date = arguments.date 45 | if date: 46 | date = dateutil.parser.parse(date).date() 47 | 48 | interface = Interface(date) 49 | 50 | if command == 'reset': 51 | interface.reset(_debug=arguments.v) 52 | elif command == 'rate': 53 | interface.rate(_debug=arguments.v) 54 | elif command == 'init': 55 | interface.init_db(force=arguments.force) 56 | sys.exit(0) 57 | 58 | rankings = interface.fetch() 59 | 60 | if len(rankings): 61 | print 'Rankings for %s' % interface.date 62 | if arguments.limit: 63 | rankings = rankings[0:arguments.limit] 64 | for rank in rankings: 65 | print rank 66 | else: 67 | print 'No rankings for %s' % interface.date 68 | -------------------------------------------------------------------------------- /doc/races.md: -------------------------------------------------------------------------------- 1 | Race selection 2 | ============== 3 | 4 | Races included in the standings: 5 | 6 | * all World Championship of Drivers races run to Formula One regulations (so no Indianapolis 500 in the 50s) from 1950 to 1980 7 | * all World Championship of Drivers races run to Formula Two regulations in 1952-53 8 | * all Formula One World Championship races since 1981 9 | * all non-championship races run to contemporary or nearly contemporary Formula One regulations since 1950, apart from national championship series (so Races of Champions, International Trophies, Bologna Sprints or non-championship Grands Prix are included, but Aurora F1, Tasman Series or South African F1 races are excluded) 10 | * some of the 1952-53 non-championship Formula Two races (including these with substantial WDC drivers appearence, such as French Formula Two Championship races and some other arbitrary races) 11 | * all post-War, pre-1950 Grandes Épreuves races (which includes some 1946 races from before F1 regulations and excludes majority of F1-compliant races from 1947 onwards) 12 | * races with mixed formula entries (e.g. F1/F2 or F1/FLibre) are separated by class and only F1 class (and F2 class in 1952-53) is scored, apart from joined F1-F2 World Championship races (German Grands Prix from 50s and 60s and 1958 Moroccan GP) 13 | 14 | Race importance factor: 15 | 16 | * WCoD and FOWC race importance constitutes 100% of base value 17 | * all other races get 50% of base value 18 | * qualifying sessions get 10% of the value for respective race 19 | * all races of the same category are scored identically, even if the race has been red-flagged before what would be full points situation 20 | 21 | Heats and aggregates: 22 | 23 | * for multi-heat races with bracket-style heats and a final, heats count as qualifying sessions and the final counts as a race (except for Bologna Sprints, in which every heat from the full bracket gets non-championship race importance) 24 | * the above also applies to 2021 sprint qualifying: the initial grid is not rated, sprint qualifying results count as a qualifying session, and the race counts as a race 25 | * for multi-heat races with aggregate-style standings, the initial grid counts as qualifying and the aggregate results count as a race 26 | 27 | Other remarks: 28 | 29 | * all qualifying sessions are listed as held on the previous day relative to the race - simply to avoid chronology mix-ups and to minimize the chances of two ratings for a driver for one day 30 | -------------------------------------------------------------------------------- /sql/views.sql: -------------------------------------------------------------------------------- 1 | DROP VIEW IF EXISTS champions; 2 | CREATE VIEW champions AS 3 | SELECT championship.year, drivers.driver, championship.points 4 | FROM championship 5 | JOIN drivers 6 | ON drivers.id = championship._driver 7 | WHERE championship.position = 1; 8 | 9 | DROP VIEW IF EXISTS driver_seasons_count; 10 | 11 | CREATE VIEW driver_seasons_count AS 12 | SELECT YEAR(rank_date) year, _driver, COUNT(rank_date) count 13 | FROM rankings GROUP BY _driver, YEAR(rank_date); 14 | 15 | DROP VIEW IF EXISTS driver_yearly_rankings; 16 | 17 | CREATE VIEW driver_yearly_rankings AS 18 | SELECT MAX(rankings.ranking) max_ranking, AVG(rankings.ranking) avg_ranking, MIN(rankings.ranking) min_ranking, 19 | YEAR(rankings.rank_date) date, COUNT(rankings.id) count, MIN(championship.position) position, rankings._driver 20 | FROM rankings 21 | LEFT JOIN championship ON rankings._driver = championship._driver AND YEAR(rankings.rank_date) = championship.year 22 | GROUP BY YEAR(rankings.rank_date), rankings._driver; 23 | 24 | DROP VIEW IF EXISTS max_date_rankings; 25 | 26 | CREATE VIEW max_date_rankings AS 27 | SELECT MAX(ranking) max_ranking, rank_date max_rank_date 28 | FROM rankings GROUP BY rank_date; 29 | 30 | DROP VIEW IF EXISTS rookie_seasons; 31 | 32 | CREATE VIEW rookie_seasons AS 33 | SELECT MIN(year) year, _driver 34 | FROM driver_seasons_count 35 | WHERE count > 6 36 | GROUP BY _driver; 37 | 38 | DROP VIEW IF EXISTS `top_yearly_rankings`; 39 | 40 | CREATE VIEW top_yearly_rankings AS 41 | SELECT MAX(max_ranking) peak, MAX(avg_ranking) average, date 42 | FROM driver_yearly_rankings 43 | WHERE count > 10 44 | GROUP BY date; 45 | 46 | DROP VIEW IF EXISTS top_average_rankings; 47 | 48 | CREATE VIEW top_average_rankings AS 49 | SELECT top_yearly_rankings.date, drivers.driver, top_yearly_rankings.average, driver_yearly_rankings.position 50 | FROM top_yearly_rankings 51 | JOIN driver_yearly_rankings ON driver_yearly_rankings.avg_ranking = top_yearly_rankings.average 52 | AND driver_yearly_rankings.date = top_yearly_rankings.date 53 | JOIN drivers ON driver_yearly_rankings._driver = drivers.id 54 | WHERE driver_yearly_rankings.count > 10; 55 | 56 | DROP VIEW IF EXISTS top_peak_rankings; 57 | 58 | CREATE VIEW top_peak_rankings AS 59 | SELECT top_yearly_rankings.date, drivers.driver, rankings.ranking, rankings.rank_date, driver_yearly_rankings.position 60 | FROM rankings 61 | JOIN top_yearly_rankings ON YEAR(rankings.rank_date) = top_yearly_rankings.date AND rankings.ranking = top_yearly_rankings.peak 62 | JOIN drivers ON rankings._driver = drivers.id 63 | JOIN driver_yearly_rankings ON rankings._driver = driver_yearly_rankings._driver AND top_yearly_rankings.date = driver_yearly_rankings.date; 64 | -------------------------------------------------------------------------------- /doc/results.md: -------------------------------------------------------------------------------- 1 | Scoring rules 2 | ============= 3 | 4 | Every race or ranked qualifying session results for each entry are handed ordinal numbers as "groups" in which the entry was classified. 5 | 6 | For qualifying, a group is simply the qualifying position (not applying any carryover/technical grid drop penalties, but applying disqualification/exclusion/grid penalties for offences during the ranked session). 7 | 8 | For races the following rules apply: 9 | 10 | * race winning entry forms group "1" 11 | * among the drivers classified on the lead lap, other groups are as follows: 2-3 places are group "2", 4-5 places are group "3", 6-10 places are group "4", places 11 and lower are group "5" 12 | * for drivers classified outside the lead lap, the groups are formed by the drivers classified with the same numbers of completed laps (each distinct lap number as a separate group) 13 | * non-classified drivers (because of completing not enough laps, but not retiring) form a single separate group, below all the classified drivers 14 | * drivers retiring due to driver-induced accidents form a single separate group, below other drivers 15 | * drivers disqualified from the race form a single separate group, below other drivers 16 | * drivers retiring due to mechanical issues form a special "0" group together with drivers which did not start the race 17 | 18 | After separating session results into groups, all entries from non-"0" groups form a "tournament". All possible entry couples are paired against each other to form "duels". The outcome of the duel may be a win/loss (if the entries are grouped in different groups) or a draw (if entries are grouped within the same group). 19 | 20 | All such duels are then treated as input for Elo rating algorithm. 21 | 22 | Specific rules regarding Elo implementation for this application's purposes: 23 | 24 | * rankings are applied (evaluated) after each session (note: debug information for Bologna Sprints does not display correct "previous" ratings: ratings are applied after each heat, yeat debug info displays inital rating from before the event; this applies to any possible situation in which drivers take part in multiple sessions in one day) 25 | * no minimum rating limit for driver is enforced 26 | * drivers are rated from their first entry (there's no initial grace period, see: challenges.txt) 27 | * shared drive entries have the effective ranking equal to the average ranking of drivers sharing the drive; pending ranking points from duels of such entries are divided equally between drivers sharing the drive 28 | * driver group disparity is varied to accommodate for dynamic shifts of relative performance within the F1 field (caused by technical changes) - see below 29 | 30 | Other than that, standard Elo rating conventions apply: 31 | 32 | * drivers start with identical initial rating 33 | * duels between high-ranked drivers change their rankings by fewer points than duels between low-ranked drivers 34 | 35 | Field disparity change: 36 | 37 | * higher disparity leads to more rating inflation - as disparity is a measure of rating difference that yields a certian probability of driver's victory, so higher disparity leads to more attribution for a victory to a driver (and less attribution to the shift of performance, e.g. car performance change) 38 | * higher rating deviation in the months prior to a race suggests a shift in relative performance (some drivers gain a lot, some divers lose a lot), so there's a need for damping further changes a bit - by lowering disparity 39 | * once the ratings are stabilized (meaning relative performance within the field had settled), disparity can be increased 40 | * this helps with the initial "rolling start" phase of the ranking (1946-1949 races) 41 | 42 | Specific parameters which are configurable: 43 | 44 | * initial driver ranking 45 | * initial disparity factor (ranking difference which drops the possibility of lower-ranked driver's win by the factor of 10) 46 | * duel importance (base, i.e. for drivers ranked below importance thresholds) for all race types 47 | * importance thresholds (for 50% of base importance and 75% of base importance) 48 | 49 | All calculation is rounded to 2 decimal places at each rating cycle. 50 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Overview 2 | ======== 3 | 4 | This application allows to apply Elo-like rankings to Formula One races. 5 | 6 | Requirements 7 | ============ 8 | 9 | * python 2.x (developed and tested on 2.7.8) 10 | * SQLAlchemy 11 | * PySQLite (optional) 12 | * MySQL connector for python (optional) 13 | * dateutil 14 | 15 | Import scripts use some additional libraries, such as: 16 | 17 | * BeautifulSoup4 18 | * lxml 19 | * urllib, urllib2, urlparse 20 | 21 | You can use the application with either SQLite database or MySQL database (in that case you, well, need a MySQL database). 22 | 23 | Installation 24 | ============ 25 | 26 | 1. Fetch this repository 27 | 2. Configure your database (see: Configuration:Database) 28 | 3. Fill the database with result data 29 | 4. All done! 30 | 31 | Usage 32 | ===== 33 | ``` 34 | usage: elo.py [-h] [--date DATE] [--limit LIMIT] [-v] [--force] [COMMAND] 35 | 36 | positional arguments: 37 | COMMAND Action to execute against the database: 38 | print - prints the rankings for all drivers ranked in 12 months, 39 | reset - resets the rankings, 40 | rate - calculates the rankings 41 | init - init clean database for the application 42 | Default value is 'print'. 43 | 44 | optional arguments: 45 | -h, --help show this help message and exit 46 | --date DATE Date for which the action should be executed. 47 | Print ratings for DATE, 48 | reset ratings all the way down to DATE 49 | or rank the races all the way up to DATE. 50 | --limit LIMIT Ranking list (display) cut-off point. 51 | -v Display verbose info on rating progress to STDERR. 52 | --force, -f Force database initialization (for "init" command). 53 | ``` 54 | 55 | Configuration 56 | ============= 57 | 58 | Application configuration consists of two JSON-formatted files: elo.json and db.json. 59 | 60 | Database 61 | -------- 62 | 63 | `db.json` holds database configuration. Two example files (for both MySQL and SQLite) are provided. If you want a quick-start solution, just rename the `db.json.SQLITE-EXAMPLE` to `db.json`. 64 | 65 | The first time you run the application against a fresh database, you have to initialize the structure, by running: 66 | 67 | ./elo.py init 68 | 69 | At any time, you can do a hard reset on the existing database, by running init with `--force` parameter. This truncates all the data, including race results data from the database, and recreates the structure. 70 | 71 | Results data are provided in sql/results.sql, in plain SQL format. 72 | 73 | Elo parameters 74 | -------------- 75 | 76 | `elo.json` contains algorithm parameter for Elo ratings: 77 | 78 | * initial driver ranking 79 | * algorithm disparity options 80 | * algorithm importance for distinct race types (championship/non-championship, qualifying/race) 81 | * algorithm importance thresholds 82 | 83 | Remember that any change to parameters should lead to ranking reset (`./elo.py reset; ./elo.py rate`) if you want consistent rating criteria throughout the entires time span of results database. 84 | 85 | More information 86 | ================ 87 | 88 | More elaborate write-up of the methodology and general approach to the problem can be found in the doc/ directory of source code repository, which contains: 89 | 90 | * races.md: explanation of race selection for the results database 91 | * results.md: summary of the scoring method 92 | * sources.md: summary of sources used for result data 93 | * challenges.md: two most dificult aspects of the project, described in detail 94 | * sql.md: useful or interesting queries to be run against the database (may only be applicable to the MySQL database) 95 | 96 | Author 97 | ====== 98 | 99 | If you want to contact me about the application, you can drop me a private message on Reddit: /u/emkael (although I know it's not exactly rocket science to work out other means of communication, from the GitHub account alone). I'll do my best to help. 100 | 101 | License 102 | ======= 103 | 104 | lol, idk. 105 | 106 | Do: use it, share it, mix it, modify it, analyse it - just leave some attribution. 107 | 108 | Don't: sell it? 109 | -------------------------------------------------------------------------------- /f1elo/elo.py: -------------------------------------------------------------------------------- 1 | import json 2 | from itertools import combinations 3 | from os import path 4 | 5 | import __main__ 6 | import dateutil 7 | from sqlalchemy import func 8 | from f1elo.model import * 9 | 10 | 11 | class Elo(object): 12 | 13 | def __init__(self, session): 14 | self.session = session 15 | self.config = json.load( 16 | open( 17 | path.join( 18 | path.dirname(__main__.__file__), 19 | 'config', 20 | 'elo.json' 21 | ) 22 | ) 23 | ) 24 | 25 | def get_ranking(self, driver, rank_date=None): 26 | rank = driver.get_ranking(rank_date) 27 | if rank: 28 | return rank.ranking 29 | return self.config['initial_ranking'] 30 | 31 | def get_entry_ranking(self, entry, date=None): 32 | return sum( 33 | [self.get_ranking(d, date) for d in entry.drivers] 34 | ) / len(entry.drivers) 35 | 36 | def get_race_disparity(self, race): 37 | race_disparity = self.config['disparity']['base_disparity'] 38 | if self.config['disparity']['adjust']: 39 | recent_date = race.date - dateutil.relativedelta.relativedelta( 40 | months=3) 41 | recent_ratings = self.session.query( 42 | func.min(Ranking.ranking).label('min'), 43 | func.max(Ranking.ranking).label('max') 44 | ).filter( 45 | Ranking.rank_date >= recent_date 46 | ).group_by( 47 | Ranking._driver 48 | ) 49 | changes_query = self.session.query( 50 | func.avg( 51 | recent_ratings.subquery().columns.max 52 | - recent_ratings.subquery().columns.min 53 | ) 54 | ) 55 | recent_rank_change = changes_query.scalar() 56 | if not recent_rank_change: 57 | recent_rank_change = 0 58 | recent_rank_change = min( 59 | self.config['disparity']['base_rating_change'], 60 | recent_rank_change) 61 | race_disparity *= ( 62 | 2.5 63 | + ( 64 | self.config['disparity']['base_rating_change'] 65 | / ( 66 | recent_rank_change 67 | - 2.0 * self.config['disparity']['base_rating_change'] 68 | ) 69 | ) 70 | ) * 0.5 71 | return race_disparity 72 | 73 | def rank_race(self, race): 74 | race_disparity = self.get_race_disparity(race) 75 | entries = race.entries 76 | entries_to_compare = [] 77 | rankings = {} 78 | new_rankings = {} 79 | for entry in entries: 80 | rankings[entry] = self.get_entry_ranking(entry, race.date) 81 | new_rankings[entry] = 0.0 82 | if entry.result_group: 83 | entries_to_compare.append(entry) 84 | for combo in combinations(entries_to_compare, 2): 85 | score = get_score( 86 | rankings[combo[0]] - rankings[combo[1]], 87 | get_outcome(combo), 88 | self.get_importance(race, 89 | [rankings[combo[0]], 90 | rankings[combo[1]]]), 91 | race_disparity 92 | ) 93 | new_rankings[combo[0]] += score 94 | new_rankings[combo[1]] -= score 95 | return new_rankings 96 | 97 | def get_importance(self, race, rankings): 98 | base_importance = self.config['importance'][race.type.code] 99 | min_rank = min(rankings) 100 | if min_rank < min(self.config['importance_threshold']): 101 | return base_importance 102 | if min_rank <= max(self.config['importance_threshold']): 103 | return base_importance * 0.75 104 | return base_importance / 2 105 | 106 | 107 | def get_outcome(entries): 108 | if entries[0].result_group < entries[1].result_group: 109 | return 1 110 | elif entries[0].result_group > entries[1].result_group: 111 | return 0 112 | return 0.5 113 | 114 | 115 | def get_score(difference, outcome, importance, disparity): 116 | return importance * (outcome - 1 / (1 + (10 ** (-difference / disparity)))) 117 | -------------------------------------------------------------------------------- /doc/sql.md: -------------------------------------------------------------------------------- 1 | Useful queries for application database: 2 | ======================================= 3 | 4 | * overall top rating progression 5 | 6 | ``` 7 | CREATE OR REPLACE VIEW max_date_rankings AS 8 | SELECT MAX(ranking) max_ranking, 9 | rank_date max_rank_date 10 | FROM rankings 11 | GROUP BY rank_date; 12 | SELECT drivers.driver, 13 | max_date_rankings.max_rank_date, 14 | max_date_rankings.max_ranking 15 | FROM max_date_rankings 16 | INNER JOIN rankings ON (rankings.ranking = max_date_rankings.max_ranking) 17 | AND (rankings.rank_date = max_date_rankings.max_rank_date) 18 | LEFT JOIN drivers ON rankings._driver = drivers.id 19 | WHERE max_ranking > ( 20 | SELECT MAX(mr.max_ranking) FROM max_date_rankings mr 21 | WHERE mr.max_rank_date < max_date_rankings.max_rank_date 22 | ); 23 | ``` 24 | 25 | * overall top peak ratings 26 | 27 | ``` 28 | SELECT drivers.driver, 29 | rankings.ranking, 30 | rankings.rank_date 31 | FROM rankings 32 | INNER JOIN ( 33 | SELECT MAX(ranking) ranking, _driver FROM rankings 34 | GROUP BY _driver 35 | ) r ON r.ranking=rankings.ranking AND r._driver=rankings._driver 36 | JOIN drivers ON rankings._driver = drivers.id 37 | GROUP BY rankings._driver 38 | ORDER BY rankings.ranking DESC; 39 | ``` 40 | 41 | * highest exit ratings 42 | 43 | ``` 44 | SELECT drivers.driver, 45 | rankings.ranking, 46 | rankings.rank_date 47 | FROM rankings 48 | INNER JOIN ( 49 | SELECT MAX(rank_date) rank_date, _driver FROM rankings GROUP BY _driver 50 | ) r ON r.rank_date=rankings.rank_date AND r._driver=rankings._driver 51 | JOIN drivers ON rankings._driver = drivers.id 52 | WHERE rankings.rank_date < CURDATE() - INTERVAL 1 YEAR 53 | ORDER BY rankings.ranking DESC; 54 | ``` 55 | 56 | * year-by-year rating inflation 57 | 58 | ``` 59 | CREATE OR REPLACE VIEW driver_yearly_rankings AS 60 | SELECT MAX(rankings.ranking) max_ranking, 61 | AVG(rankings.ranking) avg_ranking, 62 | MIN(rankings.ranking) min_ranking, 63 | YEAR(rankings.rank_date) date, COUNT(rankings.id) count, 64 | championship.position, rankings._driver 65 | FROM rankings 66 | LEFT OUTER JOIN championship ON rankings._driver = championship._driver 67 | AND YEAR(rankings.rank_date) = championship.year 68 | GROUP BY YEAR(rankings.rank_date), rankings._driver; 69 | 70 | SELECT date, 71 | MAX(max_ranking), 72 | MIN(min_ranking), 73 | AVG(avg_ranking), 74 | AVG(avg_ranking)+STDDEV(avg_ranking), 75 | AVG(avg_ranking)-STDDEV(avg_ranking) 76 | FROM driver_yearly_rankings 77 | GROUP BY date 78 | ORDER BY date ASC; 79 | ``` 80 | 81 | 82 | CREATE OR REPLACE VIEW top_yearly_rankings AS 83 | SELECT MAX(max_ranking) peak, MAX(avg_ranking) average, date 84 | FROM driver_yearly_rankings 85 | WHERE count > 10 86 | GROUP BY date; 87 | 88 | CREATE OR REPLACE VIEW top_peak_rankings AS 89 | SELECT top_yearly_rankings.date, drivers.driver, rankings.ranking, rankings.rank_date, 90 | driver_yearly_rankings.position 91 | FROM rankings 92 | JOIN top_yearly_rankings ON YEAR(rankings.rank_date) = top_yearly_rankings.date 93 | AND rankings.ranking = top_yearly_rankings.peak 94 | JOIN drivers ON rankings._driver = drivers.id 95 | JOIN driver_yearly_rankings ON rankings._driver = driver_yearly_rankings._driver 96 | AND top_yearly_rankings.date = driver_yearly_rankings.date 97 | GROUP BY top_yearly_rankings.date; 98 | 99 | CREATE OR REPLACE VIEW top_average_rankings AS 100 | SELECT top_yearly_rankings.date, drivers.driver, 101 | top_yearly_rankings.average, driver_yearly_rankings.position 102 | FROM top_yearly_rankings 103 | JOIN driver_yearly_rankings ON driver_yearly_rankings.avg_ranking = top_yearly_rankings.average 104 | AND driver_yearly_rankings.date = top_yearly_rankings.date 105 | JOIN drivers ON driver_yearly_rankings._driver = drivers.id 106 | WHERE driver_yearly_rankings.count > 10; 107 | 108 | CREATE OR REPLACE VIEW champions AS 109 | SELECT championship.year, drivers.driver, championship.points 110 | FROM championship 111 | JOIN drivers ON drivers.id = championship._driver 112 | WHERE position = 1; 113 | 114 | CREATE OR REPLACE VIEW driver_seasons_count AS 115 | SELECT YEAR(rank_date) year, _driver, COUNT(rank_date) count 116 | FROM rankings 117 | GROUP BY _driver, YEAR(rank_date); 118 | 119 | CREATE OR REPLACE VIEW rookie_seasons AS 120 | SELECT MIN(year) year, _driver 121 | FROM driver_seasons_count 122 | WHERE count > 6 123 | GROUP BY _driver; 124 | 125 | SELECT * 126 | FROM races 127 | JOIN ( 128 | SELECT MIN(date) min_date 129 | FROM races 130 | WHERE _type = 3 131 | GROUP BY YEAR(date) 132 | ) m ON m.min_date = races.date 133 | WHERE _type = 3; 134 | 135 | SELECT * 136 | FROM races 137 | JOIN ( 138 | SELECT MAX(date) max_date 139 | FROM races 140 | WHERE _type = 4 141 | GROUP BY YEAR(date) 142 | ) m ON m.max_date = races.date 143 | WHERE _type = 4; 144 | 145 | -------------------------------------------------------------------------------- /f1elo/interface.py: -------------------------------------------------------------------------------- 1 | from __future__ import print_function 2 | 3 | import datetime 4 | import sys 5 | from os import path 6 | 7 | import __main__ 8 | import dateutil.relativedelta 9 | from f1elo.db import Session 10 | from f1elo.elo import Elo 11 | from f1elo.model import * 12 | 13 | 14 | class Interface(object): 15 | 16 | def __init__(self, date=None): 17 | self.session = Session() 18 | self.date = date 19 | 20 | def init_db(self, force=False): 21 | from f1elo.model import Base 22 | if force: 23 | Base.metadata.drop_all(self.session.get_bind()) 24 | Base.metadata.create_all(self.session.get_bind()) 25 | with open(path.join(path.dirname(__main__.__file__), 26 | 'sql', 'results.sql')) as result_dump: 27 | for line in result_dump.readlines(): 28 | line = line.strip() 29 | if line and line[0:2] != '--': 30 | self.session.bind.execute(line) 31 | 32 | def reset(self, date=None, _debug=False): 33 | if date is None: 34 | date = self.date 35 | 36 | query = self.session.query(Race) 37 | if date is not None: 38 | query = query.filter(Race.date > date) 39 | for race in query.all(): 40 | race.ranked = False 41 | if _debug: 42 | print(race, file=sys.stderr) 43 | 44 | query = self.session.query(Ranking) 45 | if date is not None: 46 | query = query.filter(Ranking.rank_date > date) 47 | query.delete() 48 | 49 | self.session.commit() 50 | 51 | if date is not None: 52 | date += datetime.timedelta(1) 53 | 54 | self.date = date 55 | 56 | return 57 | 58 | def rate(self, date=None, _debug=False): 59 | if date is None: 60 | date = self.date 61 | if date is None: 62 | date = datetime.date.today() 63 | 64 | elo = Elo(self.session) 65 | race_query = self.session.query(Race).filter(Race.ranked.is_(False)) 66 | if date is not None: 67 | race_query = race_query.filter(Race.date <= date) 68 | races = race_query.order_by(Race.date, Race.id).all() 69 | 70 | for race in races: 71 | if _debug: 72 | print(race, file=sys.stderr) 73 | print('', file=sys.stderr) 74 | 75 | ranks = elo.rank_race(race) 76 | driver_ranks = {} 77 | for entry, rank in ranks.iteritems(): 78 | if entry.result_group: 79 | correction = rank / len(entry.drivers) 80 | for driver in entry.drivers: 81 | if driver not in driver_ranks: 82 | driver_ranks[driver] = 0 83 | driver_ranks[driver] += correction 84 | for driver, rank in driver_ranks.iteritems(): 85 | ranking = Ranking() 86 | ranking.rank_date = race.date 87 | ranking.ranking = round( 88 | elo.get_ranking(driver, race.date) + rank, 89 | 2) 90 | self.session.add(ranking) 91 | driver.rankings.append(ranking) 92 | 93 | if _debug: 94 | podium_rating = 0 95 | podium_rating_after = 0 96 | rating_sum = 0 97 | rating_change_sum = 0 98 | changed_ratings = 0 99 | for entry in sorted(race.entries): 100 | old_rating = elo.get_entry_ranking( 101 | entry, 102 | race.date 103 | - dateutil.relativedelta.relativedelta(days=1)) 104 | new_rating = elo.get_entry_ranking(entry) 105 | rating_sum += old_rating 106 | if entry.result_group != 0: 107 | rating_change_sum += abs(new_rating - old_rating) 108 | changed_ratings += 1 109 | print( 110 | entry, 111 | old_rating, 112 | new_rating, 113 | file=sys.stderr) 114 | if entry.result in ['1', '2', '3']: 115 | podium_rating += old_rating 116 | podium_rating_after += new_rating 117 | print('', file=sys.stderr) 118 | print('Podium rating: ', podium_rating, podium_rating_after, 119 | file=sys.stderr) 120 | print('Average rating: ', rating_sum / len(race.entries), 121 | file=sys.stderr) 122 | print('Average rating change: ', 123 | rating_change_sum / changed_ratings, 124 | file=sys.stderr) 125 | print('', file=sys.stderr) 126 | 127 | race.ranked = True 128 | date = race.date 129 | 130 | self.session.commit() 131 | 132 | self.date = date 133 | 134 | if self.date is not None: 135 | self.date += datetime.timedelta(1) 136 | 137 | return 138 | 139 | def fetch(self, date=None): 140 | if date is None: 141 | date = self.date 142 | if date is None: 143 | date = datetime.date.today() 144 | date += datetime.timedelta(1) 145 | 146 | one_year = dateutil.relativedelta.relativedelta(years=1) 147 | rankings = self.session.query( 148 | Ranking 149 | ).filter( 150 | Ranking.rank_date > (date - one_year) 151 | ).filter( 152 | Ranking.rank_date <= date 153 | ).all() 154 | 155 | drivers = {} 156 | for ranking in rankings: 157 | if ranking.driver not in drivers: 158 | drivers[ranking.driver] = ranking.driver.get_ranking(date) 159 | 160 | self.date = date 161 | 162 | return sorted(drivers.values(), 163 | key=lambda rank: rank.ranking, 164 | reverse=True) 165 | -------------------------------------------------------------------------------- /charts.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import matplotlib.pyplot as plt 3 | from sqlalchemy.sql import text 4 | from f1elo.db import Session 5 | from itertools import izip 6 | from dateutil import rrule, relativedelta 7 | from datetime import date 8 | import unicodecsv, collections, sys 9 | 10 | session = Session() 11 | engine = session.get_bind() 12 | connection = engine.connect() 13 | 14 | def fetch_raw(): 15 | raw_queries = { 16 | 'championship-races': ''' 17 | SELECT CONCAT(race, ' (', date, ')') FROM races WHERE _type = 4 18 | ''', 19 | 'all-time-top-peak': ''' 20 | SELECT drivers.driver, 21 | rankings.ranking, 22 | rankings.rank_date 23 | FROM rankings 24 | INNER JOIN ( 25 | SELECT MAX(ranking) ranking, _driver FROM rankings 26 | GROUP BY _driver 27 | ) r ON r.ranking=rankings.ranking AND r._driver=rankings._driver 28 | JOIN drivers ON rankings._driver = drivers.id 29 | ORDER BY rankings.ranking DESC 30 | LIMIT 0,20 31 | ''', 32 | 'all-time-top-peak-progression': ''' 33 | SELECT drivers.driver, 34 | max_date_rankings.max_rank_date, 35 | max_date_rankings.max_ranking 36 | FROM max_date_rankings 37 | INNER JOIN rankings ON (rankings.ranking = max_date_rankings.max_ranking) 38 | AND (rankings.rank_date = max_date_rankings.max_rank_date) 39 | LEFT JOIN drivers ON rankings._driver = drivers.id 40 | WHERE max_ranking > ( 41 | SELECT MAX(mr.max_ranking) FROM max_date_rankings mr 42 | WHERE mr.max_rank_date < max_date_rankings.max_rank_date 43 | ) 44 | ''', 45 | 'top-exit-rankings': ''' 46 | SELECT drivers.driver, 47 | rankings.ranking, 48 | rankings.rank_date 49 | FROM rankings 50 | INNER JOIN ( 51 | SELECT MAX(rank_date) rank_date, _driver FROM rankings GROUP BY _driver 52 | ) r ON r.rank_date=rankings.rank_date AND r._driver=rankings._driver 53 | JOIN drivers ON rankings._driver = drivers.id 54 | WHERE rankings.rank_date < CURDATE() - INTERVAL 1 YEAR 55 | ORDER BY rankings.ranking DESC 56 | LIMIT 0, 20 57 | ''', 58 | 'top-rankings-by-season': ''' 59 | SELECT tpr.date, tpr.driver, tpr.ranking, tpr.rank_date, tpr.position, 60 | tar.driver, ROUND(tar.average,2), tar.position, 61 | c.driver 62 | FROM top_peak_rankings tpr 63 | JOIN top_average_rankings tar ON tpr.date = tar.date 64 | JOIN champions c ON c.year = tpr.date 65 | ''', 66 | 'top-rookie-end-season-rankings': ''' 67 | SELECT drivers.driver, rankings.rank_date, rankings.ranking 68 | FROM rankings 69 | JOIN ( 70 | SELECT MAX(rankings.rank_date) rank_date, rankings._driver 71 | FROM rankings 72 | JOIN rookie_seasons ON rookie_seasons.year = YEAR(rankings.rank_date) 73 | AND rookie_seasons._driver = rankings._driver 74 | GROUP BY rankings._driver 75 | ) r ON r.rank_date = rankings.rank_date AND r._driver = rankings._driver 76 | JOIN drivers ON drivers.id = rankings._driver 77 | ORDER BY rankings.ranking 78 | DESC LIMIT 0, 20; 79 | ''', 80 | 'top-rookie-average-rankings': ''' 81 | SELECT drivers.driver, rookie_seasons.year, AVG(rankings.ranking) ranking 82 | FROM rankings 83 | JOIN rookie_seasons ON YEAR(rank_date) = rookie_seasons.year 84 | AND rookie_seasons._driver = rankings._driver 85 | JOIN drivers ON drivers.id = rankings._driver 86 | GROUP BY rankings._driver 87 | ORDER BY ranking DESC 88 | LIMIT 0,20; 89 | ''', 90 | 'season-by-season-inflation': ''' 91 | SELECT date, 92 | MAX(max_ranking), 93 | MIN(min_ranking), 94 | AVG(avg_ranking), 95 | AVG(avg_ranking)+STDDEV(avg_ranking), 96 | AVG(avg_ranking)-STDDEV(avg_ranking) 97 | FROM driver_yearly_rankings 98 | GROUP BY date 99 | ORDER BY date ASC; 100 | ''' 101 | } 102 | 103 | for file, query in raw_queries.iteritems(): 104 | csv = unicodecsv.writer(open('charts/' + file + '.csv', 'w'), lineterminator='\n') 105 | for result in connection.execute(text(query)): 106 | csv.writerow(result) 107 | 108 | def fetch_decades(): 109 | for decade in range(1950, 2025, 5): 110 | drivers = [] 111 | for year in range(decade, decade + 5): 112 | for driver_id in connection.execute(text(''' 113 | (SELECT _driver 114 | FROM driver_yearly_rankings 115 | WHERE date = :year 116 | ORDER BY avg_ranking DESC 117 | LIMIT 0,3) 118 | UNION DISTINCT 119 | (SELECT _driver 120 | FROM driver_yearly_rankings 121 | WHERE date = :year 122 | ORDER BY max_ranking DESC 123 | LIMIT 0,3) 124 | '''), year=year): 125 | drivers.append(driver_id[0]) 126 | rankings = connection.execute(text("SELECT rankings.rank_date, MAX(rankings.ranking), rankings._driver, drivers.* FROM rankings JOIN drivers ON drivers.id = rankings._driver WHERE rank_date >= :date_from AND rank_date <= :date_to AND _driver IN :drivers GROUP BY rankings._driver, rankings.rank_date"), date_from=str(decade)+'-01-01', date_to=str(decade+4)+'-12-31', drivers=drivers) 127 | csv = unicodecsv.writer(open('charts/' + str(decade) + 's.csv', 'w')) 128 | tree = lambda: collections.defaultdict(tree) 129 | table = tree() 130 | dates = set() 131 | for row in rankings: 132 | dates.add(str(row[0])) 133 | table[row[4]][str(row[0])] = row[1] 134 | dates = list(dates) 135 | dates.append('') 136 | dates = sorted(dates) 137 | output = [] 138 | output.append(dates) 139 | for driver, results in table.iteritems(): 140 | row = [] 141 | row.append(driver) 142 | for date in dates: 143 | if date: 144 | if results.has_key(date): 145 | row.append(results[date]) 146 | else: 147 | row.append('') 148 | output.append(row) 149 | csv.writerows(output) 150 | 151 | def fetch_rolling(): 152 | output = [] 153 | min_date = connection.execute(text('SELECT MIN(date) FROM races')).first()[0].replace(day=1) 154 | for begin_date in list(rrule.rrule(rrule.MONTHLY, dtstart=min_date, until=date.today())): 155 | end_date = begin_date + relativedelta.relativedelta(months=6) 156 | sql = 'SELECT AVG(avg), STDDEV(avg), AVG(dev) FROM (SELECT AVG(ranking) avg, STDDEV(ranking) dev FROM rankings WHERE rank_date BETWEEN :begin_date AND :end_date GROUP BY _driver) avg' 157 | result = connection.execute(text(sql), begin_date=begin_date, end_date=end_date).first() 158 | output.append([end_date.strftime('%Y-%m')] + result.values()) 159 | unicodecsv.writer(open('charts/rolling_averages.csv', 'w')).writerows(output) 160 | 161 | if len(sys.argv) < 2: 162 | sys.argv.append('all') 163 | 164 | if sys.argv[1] == 'sql': 165 | fetch_raw() 166 | elif sys.argv[1] == 'decades': 167 | fetch_decades() 168 | elif sys.argv[1] == 'rolling': 169 | fetch_rolling() 170 | elif sys.argv[1] == 'all': 171 | fetch_raw() 172 | fetch_decades() 173 | fetch_rolling() 174 | -------------------------------------------------------------------------------- /f1elo/model.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from functools import total_ordering 3 | 4 | from sqlalchemy import Column, ForeignKey, Table 5 | from sqlalchemy.ext.declarative import declarative_base 6 | from sqlalchemy.orm import relationship 7 | from sqlalchemy.types import Boolean, Date, Float, Integer, String 8 | 9 | Base = declarative_base() 10 | 11 | 12 | class Country(Base): 13 | __tablename__ = 'countries' 14 | 15 | id = Column(Integer, primary_key=True) 16 | name = Column(String(255), index=True) 17 | 18 | drivers = relationship( 19 | 'Driver', 20 | back_populates='country', 21 | cascade="all", 22 | passive_deletes=True) 23 | 24 | @staticmethod 25 | def fetch(name, session): 26 | country = session.query(Country).filter(Country.name == name).first() 27 | if not country: 28 | country = Country() 29 | country.name = name 30 | session.add(country) 31 | return country 32 | 33 | 34 | class Driver(Base): 35 | __tablename__ = 'drivers' 36 | 37 | id = Column(Integer, primary_key=True) 38 | driver = Column(String(255), index=True) 39 | 40 | _country = Column( 41 | Integer, 42 | ForeignKey( 43 | 'countries.id', 44 | onupdate="CASCADE", 45 | ondelete="CASCADE")) 46 | country = relationship( 47 | 'Country', 48 | back_populates='drivers', 49 | order_by='Driver.id') 50 | 51 | rankings = relationship( 52 | 'Ranking', 53 | order_by='Ranking.rank_date,Ranking.id', 54 | back_populates='driver', 55 | cascade="all", 56 | passive_deletes=True) 57 | 58 | def __repr__(self): 59 | return (u"<%s (#%d)>" % (self.driver, self.id)).encode('utf8') 60 | 61 | def get_ranking(self, rank_date=None): 62 | ranks = self.rankings 63 | if rank_date is not None: 64 | ranks = [r for r in ranks if r.rank_date <= rank_date] 65 | if len(ranks): 66 | return ranks[-1] 67 | return None 68 | 69 | @staticmethod 70 | def fetch(name, country, session): 71 | driver = session.query(Driver).filter(Driver.driver == name).first() 72 | if not driver: 73 | driver = Driver() 74 | driver.driver = name 75 | driver.country = Country.fetch(country, session) 76 | session.add(driver) 77 | return driver 78 | 79 | 80 | driver_entry = Table('driver_entries', Base.metadata, 81 | Column( 82 | '_driver', 83 | Integer, 84 | ForeignKey( 85 | 'drivers.id', 86 | onupdate="CASCADE", 87 | ondelete="CASCADE")), 88 | Column( 89 | '_entry', 90 | Integer, 91 | ForeignKey( 92 | 'entries.id', 93 | onupdate="CASCADE", 94 | ondelete="CASCADE")), 95 | Column('id', Integer, primary_key=True)) 96 | 97 | 98 | @total_ordering 99 | class Entry(Base): 100 | __tablename__ = 'entries' 101 | 102 | id = Column(Integer, primary_key=True) 103 | result = Column(String(255)) 104 | car_no = Column(Integer, index=True) 105 | result_group = Column(Integer, index=True) 106 | 107 | _race = Column( 108 | Integer, 109 | ForeignKey( 110 | 'races.id', 111 | onupdate="CASCADE", 112 | ondelete="CASCADE")) 113 | race = relationship( 114 | 'Race', 115 | back_populates='entries', 116 | order_by=result_group) 117 | 118 | drivers = relationship( 119 | 'Driver', 120 | secondary=driver_entry, 121 | cascade="all", 122 | passive_deletes=True) 123 | 124 | def __repr__(self): 125 | return ('#%s (%s) %s[%d]' % ( 126 | self.car_no, 127 | ', '.join([driver.__repr__().decode('utf8') 128 | for driver in self.drivers]), 129 | self.result, 130 | self.result_group)).encode('utf8') 131 | 132 | def __eq__(self, other): 133 | return self.id == other.id 134 | 135 | def __lt__(self, other): 136 | try: 137 | self_result = int(self.result) 138 | except ValueError: 139 | self_result = sys.maxint 140 | try: 141 | other_result = int(other.result) 142 | except ValueError: 143 | other_result = sys.maxint 144 | if self_result == other_result: 145 | if self.result_group == other.result_group: 146 | return self.id < other.id 147 | else: 148 | return self.result_group < other.result_group 149 | else: 150 | return self_result < other_result 151 | 152 | 153 | class Race(Base): 154 | __tablename__ = 'races' 155 | 156 | id = Column(Integer, primary_key=True) 157 | race = Column(String(1024)) 158 | date = Column(Date, index=True) 159 | ranked = Column(Boolean, 160 | nullable=False, 161 | server_default='0', default=False, 162 | index=True) 163 | 164 | _type = Column( 165 | Integer, 166 | ForeignKey( 167 | 'race_types.id', 168 | onupdate="CASCADE", 169 | ondelete="CASCADE")) 170 | type = relationship( 171 | 'RaceType', 172 | back_populates='races', 173 | order_by='Race.date') 174 | 175 | entries = relationship( 176 | 'Entry', 177 | back_populates='race', 178 | order_by='Entry.result_group', 179 | cascade="all", 180 | passive_deletes=True) 181 | 182 | def __repr__(self): 183 | return ('%s (%s)' % (self.race, self.date)).encode('utf8') 184 | 185 | 186 | class RaceType(Base): 187 | __tablename__ = 'race_types' 188 | 189 | id = Column(Integer, primary_key=True) 190 | code = Column(String(255), index=True) 191 | description = Column(String(1024)) 192 | 193 | races = relationship( 194 | 'Race', 195 | back_populates='type', 196 | cascade="all", 197 | passive_deletes=True) 198 | 199 | def __repr__(self): 200 | return ('%s (%s)' % (self.description, self.code)).encode('utf8') 201 | 202 | 203 | class Ranking(Base): 204 | __tablename__ = 'rankings' 205 | 206 | id = Column(Integer, primary_key=True) 207 | rank_date = Column(Date, index=True) 208 | ranking = Column(Float, index=True) 209 | 210 | _driver = Column( 211 | Integer, 212 | ForeignKey( 213 | 'drivers.id', 214 | onupdate="CASCADE", 215 | ondelete="CASCADE")) 216 | driver = relationship( 217 | 'Driver', 218 | back_populates='rankings', 219 | order_by=rank_date) 220 | 221 | def __repr__(self): 222 | return ("%s: %0.2f (%s)" % ( 223 | self.driver.__repr__().decode('utf8'), 224 | self.ranking, self. rank_date)).encode('utf8') 225 | 226 | 227 | __all__ = ('Country', 'Driver', 'Entry', 'Ranking', 'Race', 'RaceType') 228 | -------------------------------------------------------------------------------- /doc/challenges.md: -------------------------------------------------------------------------------- 1 | Challenges and issues with the rating process 2 | ============================================= 3 | 4 | Two main obstacles had to be overcome to achieve satisfactory quality of the analysis and the entire project. 5 | 6 | One of them was purely technical, the other - theoretical/methodological. This documents presents them very briefly. 7 | 8 | Gathering and unifying data 9 | --------------------------- 10 | 11 | The project obviously involved dealing with lots of race and qualifying results (well, basically, with *all* of it). 12 | 13 | The usual process of compiling results into project database consisted of several steps: 14 | 15 | 1. scraping data from various public web sources 16 | 2. converting data to consistent format (i.e. CSV) 17 | 3. semi-manual compilation of data in the CSV to importable format 18 | 4. importing CSV data to project database 19 | 5. normalization of imported data 20 | 21 | ### Scraping the data 22 | 23 | At first, I tried to use Wikipedia as an initial source for race results. Since any source with uniform tabular would do just fine, it seemed like a good idea at the time. Unfortunately, wikipedia is far from uniform. Throughout 1000+ wikipedia pages for both championship and non-championship races, not only the format of the results table varies, but the number of tables (separate qualifying table vs. "grid" column), or the placement and headings of the tables, as well. 24 | 25 | Plus, Wikipedia is far from being complete in terms of non-championship races results. And since that meant I would need a separate data source anyway, fighting with Wikipedia scrape automation didn't seem worth it (despite the presence of a proper API for fetching revisions of wiki pages). 26 | 27 | The next source, this time with consitently formatted tables, was [A Second A Lap blog](http://second-a-lap.blogspot.com/) - which showcases one ray each day. Main advantage of the source: lightweight native Blogspot API for fetching article contents. Main (and critical) flaw: the series is in the mid-60s as of now so the data would not be complete for a long time. Also, the tables lacked entry numbers, a nice flavour in the data. 28 | 29 | Fortunately, that's were [Ergast Developer API](http://ergast.com/mrd/db) came in handy. The SQL database image provided an achievable baseline for testing the algorithm (on championship race results and the qualifying data included in the dump). As a side-effect, after running some checks on the Ergast-imported data, some inconsistencies were detected and reported to Ergast maintainers. 30 | 31 | The initial source for non-championship races was then chosen: [The Formula One Archives](http://www.silhouet.com/motorsport/archive/f1/title.html). That meant dealing with plain-text data and lots of manual aligning of the data to form columns. Surprisingly, CSV-formatted data manipulation in any office software works very well so this wasn't as hard as it seemed. 32 | 33 | Yet still, there was a need for qualifying/prequalifying data not included in Ergast DB. So the ultimate source (without which compiling wouldn't be possible in relatively short time) was the magnificent [Chicane F1 website](http://chicanef1.com/). Despite some minor errors in the data (most likely - propagation of print errors from original sources, small things like wrong digits in timing which then lead to incorrect qualifying speeds by which I had to sort my data to discard grid penalties), the website data turned out bullet-proof (comprehensive, consistent, covering at least everything covered in other sources) and dataset was completed. 34 | 35 | ### Scraped data conversion 36 | 37 | The conversion process for the sources which I managed to automate happened on the fly. The helper script for both scraping and HTML->CSV conversion is available in the dumps/ directory of project tree. 38 | 39 | The directory includes: 40 | 41 | * scrapers for chicanef1 and second-a-lap single result pages 42 | * scrapers which extract all possible qualifying and non-championship result page URLs from chicane 43 | * utility which fetches URLs and converts the tables to CSV files and compiles multiple CSV files to single file, producing the list of compiled files as a side-effect 44 | 45 | **I urge you to proceed with highest level of attention when trying to scrape the websites on your own using these tools.** 46 | They involve lots of excess requests (since it was easier to fetch everything that moves and filter out the weeds afterwards) and may generate substantial bandwidth on the source websites if used without common sense. And the last thing I'd want is to cause trouble to the amazing people who put these data for public access in the first place. 47 | 48 | ### Compiling the data 49 | 50 | The most time-consuming and boring part of the whole process. Extending the CSV data to accomodate algorithm's ranking criteria. Spread sheet manual labor with lots of filtering, sanity checks, conditional formulas, more filtering, more formula etc. 51 | 52 | Nothing useful in terms of source-code or data not included in the resulting database came up from this stage, apart from a sense of satisfaction and drastic appreciation of spreadsheet software. 53 | 54 | ### Importing the data 55 | 56 | That's where the result database structure kicks in. For clarity, I'll show you the schema first: 57 | 58 | +---------+ +------------+ 59 | | races | | race_types | 60 | +---------+ 0..* 1 +------------+ 61 | | + date |-----------| + code | 62 | | + race | _type +------------+ 63 | +---------+ 64 | 1 | _race 65 | | 66 | 0..* | 67 | +-----------------+ +-----------+ +--------------+ 68 | | entries | | drivers | | rankings | 69 | +-----------------+ +-----------+ 1 0..* +--------------+ 70 | | + result | 0..* 0..* | + driver |--------------| + ranking | 71 | | + car_no |------------------| + country | _driver | + rank_date | 72 | | + result_group | _entry _driver +-----------+ +--------------+ 73 | +-----------------+ (driver_entries) 74 | 75 | Since `race_types` table is a pre-filled dictionary and values in `rankings` are only calculated by the main rating application, dataset import operates on `races`, `entries` and `drivers`. 76 | 77 | The `races` table is pretty much straight-forward, so CSV-formatted file can easily be imported into the table (e.g. with the help of any proper web-based RDBMS administration tool). 78 | 79 | The aim of main import procedure was to populate the `drivers`, `driver_entries` and `entries` tables, with - if possible - shared drives support. 80 | 81 | That pushed some constraints on the amount of information and format of the imported CSV file. Very rudimentary import script (import-csv.py) assumes CSV file with either of the following line formats: 82 | 83 | * 6 columns: race ID, text description of entry result, car number, driver country, driver name, result group for Elo algorithm outcome 84 | * 2 columns: driver country, driver name 85 | 86 | Detecting first row format created a new entry for race, the second one - appended another driver to a shared drive for the last processed entry. On top of that, the `drivers` table was being filled with every driver name not yet present in the database. 87 | 88 | ### Data normalization 89 | 90 | Usually after running import script, the main concern was the normalization of driver names present in the database. Since lookup and identification of drivers during the import took only their into account, there were lots of duplicates - drivers racing under nicknames, drivers with multiple names they'd figured under or drivers with various spelling variant of their names. 91 | 92 | After manual normalization of such values, the dataset was ready for processing (usually - resetting the ranking DB to the date of first newly imported session and running the rating onwards). 93 | 94 | Preventing ranking inflation/deflation 95 | -------------------------------------- 96 | 97 | Applying Elo rating algorithm to a selected sample of players and not to a wider spectrum of skill among competitors has several flaws. 98 | 99 | It's highly unlikely that the distribution of skill among drivers who already reached the top class of motorsports is compatible with normal distribution or logistic distribution, which makes it rather inconvenient for purposes of Elo rating. 100 | 101 | The evolution of ranking values over time is sensitive to various effects: 102 | 103 | * drivers entering the sport aren't "rookies" with negligible skill (in the classic algorithm: until some number of ranked games) 104 | * drivers with lower skill tend to leave the sport sooner than drivers with higher skill 105 | * the conditions which influence outcomes of duels between drivers change rapidly due to technical development and/or team changes - so the likelyhood of yet lower rated driver defeating higher rated driver is sometimes unpredictable (and long streaks of lower ranked drivers defeating higher ranked drivers are not uncommon, which leads to constant "leap-frogging" in the rankings and rapid rating changes) 106 | 107 | In classical Elo model (i.e. players entering the rankings with fairly low ranking, with constant disparity factor of the game) this leads to ranking inflation over time. This can be managed to some extent by a few simple adjustement of Elo parameters: 108 | 109 | * the entry ranking for new players (which can be changed in application configuration and has been set at a fairly high level of 2000 points) 110 | * the threshold ranking values for decreasing rating changes coming from duels (by default the thresholds are set so that newcomers already fall into the middle interval and very quickly fall into the highest interval, while it's still possible for them to fall into to lower interval of higher rating swings) 111 | * the disparity value of the field (lower value tends to stop already dominating drivers from gaining even more advantage while higher value is better when the field is less predictive, e.g. at the beginning of the season) 112 | 113 | The aforementioned adjustements made thigns slightly better, but the model was still unstable, as it was very easy to overcorrect - which, in turn, led to rating deflation and underappreciation of drivers as time went by. 114 | 115 | From the beginning I hoped to avoid switching to some more complex algorithms, like Glicko, and to stay as closely to core Elo rating as possible. Yet some changes were still necessary. 116 | 117 | As I've already mentioned in the write-up of pairing and ranking method (see: doc/results.txt), the field disparity can be adjusted dynamically. The more the ratings change over recent time, the lower the disparity (so that initial shift of power among the grid pushes the drivers closer the top but prevents their dominanve to escalate until the ratings are stabilized again). 118 | 119 | The cut-off had to be more subtle than linear decrease of disparity, so the following formula was used: 120 | 121 | `disparity` = `base_disparity` * 0.5 * (2.5 + `base_rating_change` / (`rating_change` - 2 * `base_rating_change`))) [if `rating_change` <= `base_rating_change`] 122 | 123 | `disparity` = 0.75 * `base_disparity` [if `rating_change` >= `base_rating_change`], where: 124 | 125 | * `base_disparity` and `base_rating_change` are application parameters 126 | * `rating_change` is average amplitude of driver rating for previous 3 months (max(rating) - min(rating) over 3 months for every driver, averaged) 127 | 128 | The equation may look scary, but it's just a concave segment of hyperbolic function, spanning from `base_disparity` in 0 to 75% of `base_disparity` in `base_rating_change` and staying constant for higher values of rating change. The adjustement can be turned off in application configuration. 129 | 130 | Now, it has to be said that if you have a predetermined bias or prejudice for (or against) certain drivers or decades, it's fairly easy to tweak the algorithm so that it yields results that satisfy you. For the results I'm showing, I tried my best to keep overall ranking conditions over the entire field constant over time. It's debatable if that's not defeating the entire point of the simulation - one of the main reasons for using Elo-like rating was to separate absolute driver achievements (yes, "achievements", not "skill", since comparisons among the entire field do not factor out technical level of cars driven by competitors) from the general "quality" of the grid they're fielded against. But as the average rating is comparable over decades, the variation is not - so some conclusions on overall quality of certain grids can be drawn. 131 | 132 | For full disclosure purposes: simple tweaks to field disparity either underline the achievements of Fangio era (with rapid inflation of rating in the early years - the fact that the sport got dominated that much not long after the beginning doesn't help) or Vettel's achievements (with inflation kicking in around Schumacher era). It's interesting to see, though, that no matter which way the absolute ratings are skewed, last decade of the sport shows signs of "standing on the shoulders of giants": Alonso, by defeating Schumacher in 2005-06, gets higher ratings, which then are being surpassed by Vettel and, sometimes, Hamilton at the moment. Basically - beating highly rated drivers in a space of 1-2 seasons elevates a driver even higher. 133 | -------------------------------------------------------------------------------- /sql/championship.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS `championship`; 2 | CREATE TABLE IF NOT EXISTS `championship` ( 3 | `id` int(11) NOT NULL, 4 | `year` int(11) NOT NULL, 5 | `position` int(11) NOT NULL, 6 | `_driver` int(11) NOT NULL, 7 | `points` float NOT NULL 8 | ) ENGINE=InnoDB AUTO_INCREMENT=1271 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 9 | 10 | TRUNCATE TABLE `championship`; 11 | 12 | INSERT INTO `championship` VALUES(1, 1950, 1, 15, 30); 13 | INSERT INTO `championship` VALUES(2, 1950, 2, 109, 27); 14 | INSERT INTO `championship` VALUES(3, 1950, 3, 79, 24); 15 | INSERT INTO `championship` VALUES(4, 1950, 4, 56, 13); 16 | INSERT INTO `championship` VALUES(5, 1950, 5, 61, 11); 17 | INSERT INTO `championship` VALUES(6, 1950, 8, 28, 5); 18 | INSERT INTO `championship` VALUES(7, 1950, 9, 27, 4); 19 | INSERT INTO `championship` VALUES(8, 1950, 9, 30, 4); 20 | INSERT INTO `championship` VALUES(9, 1950, 9, 2, 4); 21 | INSERT INTO `championship` VALUES(10, 1950, 13, 7, 3); 22 | INSERT INTO `championship` VALUES(11, 1950, 13, 83, 3); 23 | INSERT INTO `championship` VALUES(12, 1950, 13, 1, 3); 24 | INSERT INTO `championship` VALUES(13, 1950, 13, 126, 3); 25 | INSERT INTO `championship` VALUES(14, 1950, 18, 82, 3); 26 | INSERT INTO `championship` VALUES(15, 1950, 19, 118, 2); 27 | INSERT INTO `championship` VALUES(16, 1950, 22, 6, 1); 28 | INSERT INTO `championship` VALUES(17, 1951, 1, 109, 31); 29 | INSERT INTO `championship` VALUES(18, 1951, 2, 61, 25); 30 | INSERT INTO `championship` VALUES(19, 1951, 3, 119, 24); 31 | INSERT INTO `championship` VALUES(20, 1951, 4, 15, 19); 32 | INSERT INTO `championship` VALUES(21, 1951, 5, 26, 15); 33 | INSERT INTO `championship` VALUES(22, 1951, 6, 75, 10); 34 | INSERT INTO `championship` VALUES(23, 1951, 8, 118, 7); 35 | INSERT INTO `championship` VALUES(24, 1951, 10, 27, 5); 36 | INSERT INTO `championship` VALUES(25, 1951, 11, 79, 4); 37 | INSERT INTO `championship` VALUES(26, 1951, 12, 56, 3); 38 | INSERT INTO `championship` VALUES(27, 1951, 12, 44, 3); 39 | INSERT INTO `championship` VALUES(28, 1951, 15, 7, 2); 40 | INSERT INTO `championship` VALUES(29, 1951, 15, 33, 2); 41 | INSERT INTO `championship` VALUES(30, 1952, 1, 61, 36); 42 | INSERT INTO `championship` VALUES(31, 1952, 2, 15, 24); 43 | INSERT INTO `championship` VALUES(32, 1952, 3, 75, 22); 44 | INSERT INTO `championship` VALUES(33, 1952, 4, 114, 10); 45 | INSERT INTO `championship` VALUES(34, 1952, 5, 211, 10); 46 | INSERT INTO `championship` VALUES(35, 1952, 6, 83, 9); 47 | INSERT INTO `championship` VALUES(36, 1952, 8, 26, 8); 48 | INSERT INTO `championship` VALUES(37, 1952, 9, 119, 6.5); 49 | INSERT INTO `championship` VALUES(38, 1952, 11, 171, 6); 50 | INSERT INTO `championship` VALUES(39, 1952, 13, 175, 3); 51 | INSERT INTO `championship` VALUES(40, 1952, 13, 215, 3); 52 | INSERT INTO `championship` VALUES(41, 1952, 16, 201, 2); 53 | INSERT INTO `championship` VALUES(42, 1952, 17, 12, 2); 54 | INSERT INTO `championship` VALUES(43, 1952, 17, 118, 2); 55 | INSERT INTO `championship` VALUES(44, 1952, 17, 206, 2); 56 | INSERT INTO `championship` VALUES(45, 1952, 17, 212, 2); 57 | INSERT INTO `championship` VALUES(46, 1953, 1, 61, 34.5); 58 | INSERT INTO `championship` VALUES(47, 1953, 2, 109, 28); 59 | INSERT INTO `championship` VALUES(48, 1953, 3, 15, 26); 60 | INSERT INTO `championship` VALUES(49, 1953, 4, 211, 19); 61 | INSERT INTO `championship` VALUES(50, 1953, 5, 26, 17); 62 | INSERT INTO `championship` VALUES(51, 1953, 6, 119, 13.5); 63 | INSERT INTO `championship` VALUES(52, 1953, 8, 33, 7); 64 | INSERT INTO `championship` VALUES(53, 1953, 9, 118, 6.5); 65 | INSERT INTO `championship` VALUES(54, 1953, 11, 162, 4); 66 | INSERT INTO `championship` VALUES(55, 1953, 12, 12, 4); 67 | INSERT INTO `championship` VALUES(56, 1953, 14, 244, 2); 68 | INSERT INTO `championship` VALUES(57, 1953, 15, 302, 2); 69 | INSERT INTO `championship` VALUES(58, 1954, 1, 109, 42); 70 | INSERT INTO `championship` VALUES(59, 1954, 2, 119, 25.1); 71 | INSERT INTO `championship` VALUES(60, 1954, 3, 211, 24.6); 72 | INSERT INTO `championship` VALUES(61, 1954, 4, 12, 17); 73 | INSERT INTO `championship` VALUES(62, 1954, 5, 332, 12); 74 | INSERT INTO `championship` VALUES(63, 1954, 7, 287, 8); 75 | INSERT INTO `championship` VALUES(64, 1954, 8, 15, 6); 76 | INSERT INTO `championship` VALUES(65, 1954, 8, 308, 6); 77 | INSERT INTO `championship` VALUES(66, 1954, 11, 260, 6); 78 | INSERT INTO `championship` VALUES(67, 1954, 13, 162, 4.1); 79 | INSERT INTO `championship` VALUES(68, 1954, 14, 129, 4.1); 80 | INSERT INTO `championship` VALUES(69, 1954, 15, 83, 4); 81 | INSERT INTO `championship` VALUES(70, 1954, 16, 249, 4); 82 | INSERT INTO `championship` VALUES(71, 1954, 17, 28, 3); 83 | INSERT INTO `championship` VALUES(72, 1954, 18, 243, 2); 84 | INSERT INTO `championship` VALUES(73, 1954, 18, 307, 2); 85 | INSERT INTO `championship` VALUES(74, 1954, 18, 26, 2); 86 | INSERT INTO `championship` VALUES(75, 1954, 18, 161, 2); 87 | INSERT INTO `championship` VALUES(76, 1954, 25, 61, 1.1); 88 | INSERT INTO `championship` VALUES(77, 1954, 26, 171, 0.1); 89 | INSERT INTO `championship` VALUES(78, 1955, 1, 109, 40); 90 | INSERT INTO `championship` VALUES(79, 1955, 2, 129, 23.5); 91 | INSERT INTO `championship` VALUES(80, 1955, 3, 12, 13); 92 | INSERT INTO `championship` VALUES(81, 1955, 4, 373, 12); 93 | INSERT INTO `championship` VALUES(82, 1955, 5, 15, 12); 94 | INSERT INTO `championship` VALUES(83, 1955, 6, 75, 9); 95 | INSERT INTO `championship` VALUES(84, 1955, 8, 260, 7); 96 | INSERT INTO `championship` VALUES(85, 1955, 9, 308, 6); 97 | INSERT INTO `championship` VALUES(86, 1955, 10, 171, 6); 98 | INSERT INTO `championship` VALUES(87, 1955, 11, 332, 5.5); 99 | INSERT INTO `championship` VALUES(88, 1955, 15, 201, 3); 100 | INSERT INTO `championship` VALUES(89, 1955, 16, 119, 3); 101 | INSERT INTO `championship` VALUES(90, 1955, 18, 307, 2); 102 | INSERT INTO `championship` VALUES(91, 1955, 18, 26, 2); 103 | INSERT INTO `championship` VALUES(92, 1955, 18, 372, 2); 104 | INSERT INTO `championship` VALUES(93, 1955, 21, 245, 2); 105 | INSERT INTO `championship` VALUES(94, 1955, 22, 287, 1.5); 106 | INSERT INTO `championship` VALUES(95, 1956, 1, 109, 30); 107 | INSERT INTO `championship` VALUES(96, 1956, 2, 129, 27); 108 | INSERT INTO `championship` VALUES(97, 1956, 3, 186, 25); 109 | INSERT INTO `championship` VALUES(98, 1956, 4, 171, 22); 110 | INSERT INTO `championship` VALUES(99, 1956, 6, 373, 7.5); 111 | INSERT INTO `championship` VALUES(100, 1956, 8, 201, 6); 112 | INSERT INTO `championship` VALUES(101, 1956, 9, 152, 6); 113 | INSERT INTO `championship` VALUES(102, 1956, 10, 279, 5); 114 | INSERT INTO `championship` VALUES(103, 1956, 11, 195, 4); 115 | INSERT INTO `championship` VALUES(104, 1956, 11, 211, 4); 116 | INSERT INTO `championship` VALUES(105, 1956, 11, 308, 4); 117 | INSERT INTO `championship` VALUES(106, 1956, 15, 21, 3); 118 | INSERT INTO `championship` VALUES(107, 1956, 15, 371, 3); 119 | INSERT INTO `championship` VALUES(108, 1956, 18, 372, 3); 120 | INSERT INTO `championship` VALUES(109, 1956, 19, 524, 2); 121 | INSERT INTO `championship` VALUES(110, 1956, 19, 26, 2); 122 | INSERT INTO `championship` VALUES(111, 1956, 19, 56, 2); 123 | INSERT INTO `championship` VALUES(112, 1956, 19, 309, 2); 124 | INSERT INTO `championship` VALUES(113, 1956, 19, 355, 2); 125 | INSERT INTO `championship` VALUES(114, 1956, 25, 397, 1.5); 126 | INSERT INTO `championship` VALUES(115, 1956, 25, 170, 1.5); 127 | INSERT INTO `championship` VALUES(116, 1957, 1, 109, 40); 128 | INSERT INTO `championship` VALUES(117, 1957, 2, 129, 25); 129 | INSERT INTO `championship` VALUES(118, 1957, 3, 308, 16); 130 | INSERT INTO `championship` VALUES(119, 1957, 4, 211, 13); 131 | INSERT INTO `championship` VALUES(120, 1957, 5, 523, 11); 132 | INSERT INTO `championship` VALUES(121, 1957, 6, 665, 10); 133 | INSERT INTO `championship` VALUES(122, 1957, 7, 21, 10); 134 | INSERT INTO `championship` VALUES(123, 1957, 8, 186, 9.5); 135 | INSERT INTO `championship` VALUES(124, 1957, 11, 171, 6); 136 | INSERT INTO `championship` VALUES(125, 1957, 12, 401, 5); 137 | INSERT INTO `championship` VALUES(126, 1957, 13, 521, 4); 138 | INSERT INTO `championship` VALUES(127, 1957, 15, 245, 4); 139 | INSERT INTO `championship` VALUES(128, 1957, 16, 12, 3.5); 140 | INSERT INTO `championship` VALUES(129, 1957, 18, 93, 2); 141 | INSERT INTO `championship` VALUES(130, 1957, 20, 119, 1); 142 | INSERT INTO `championship` VALUES(131, 1957, 21, 530, 1); 143 | INSERT INTO `championship` VALUES(132, 1957, 21, 371, 1); 144 | INSERT INTO `championship` VALUES(133, 1958, 1, 211, 42); 145 | INSERT INTO `championship` VALUES(134, 1958, 2, 129, 41); 146 | INSERT INTO `championship` VALUES(135, 1958, 3, 523, 24); 147 | INSERT INTO `championship` VALUES(136, 1958, 4, 93, 15); 148 | INSERT INTO `championship` VALUES(137, 1958, 5, 186, 14); 149 | INSERT INTO `championship` VALUES(138, 1958, 6, 21, 14); 150 | INSERT INTO `championship` VALUES(139, 1958, 7, 12, 12); 151 | INSERT INTO `championship` VALUES(140, 1958, 8, 308, 12); 152 | INSERT INTO `championship` VALUES(141, 1958, 9, 401, 11); 153 | INSERT INTO `championship` VALUES(142, 1958, 10, 683, 9); 154 | INSERT INTO `championship` VALUES(143, 1958, 11, 521, 9); 155 | INSERT INTO `championship` VALUES(144, 1958, 11, 171, 9); 156 | INSERT INTO `championship` VALUES(145, 1958, 14, 109, 7); 157 | INSERT INTO `championship` VALUES(146, 1958, 18, 759, 3); 158 | INSERT INTO `championship` VALUES(147, 1958, 18, 733, 3); 159 | INSERT INTO `championship` VALUES(148, 1958, 18, 522, 3); 160 | INSERT INTO `championship` VALUES(149, 1958, 21, 739, 2); 161 | INSERT INTO `championship` VALUES(150, 1958, 23, 665, 1.5); 162 | INSERT INTO `championship` VALUES(151, 1958, 23, 416, 1.5); 163 | INSERT INTO `championship` VALUES(152, 1959, 1, 733, 31); 164 | INSERT INTO `championship` VALUES(153, 1959, 2, 523, 27); 165 | INSERT INTO `championship` VALUES(154, 1959, 3, 129, 25.5); 166 | INSERT INTO `championship` VALUES(155, 1959, 4, 683, 20); 167 | INSERT INTO `championship` VALUES(156, 1959, 5, 12, 19); 168 | INSERT INTO `championship` VALUES(157, 1959, 6, 739, 16.5); 169 | INSERT INTO `championship` VALUES(158, 1959, 7, 745, 13); 170 | INSERT INTO `championship` VALUES(159, 1959, 8, 759, 10); 171 | INSERT INTO `championship` VALUES(160, 1959, 9, 665, 10); 172 | INSERT INTO `championship` VALUES(161, 1959, 13, 684, 5); 173 | INSERT INTO `championship` VALUES(162, 1959, 13, 21, 5); 174 | INSERT INTO `championship` VALUES(163, 1959, 15, 524, 3); 175 | INSERT INTO `championship` VALUES(164, 1959, 17, 171, 2); 176 | INSERT INTO `championship` VALUES(165, 1959, 17, 522, 2); 177 | INSERT INTO `championship` VALUES(166, 1960, 1, 733, 43); 178 | INSERT INTO `championship` VALUES(167, 1960, 2, 739, 34); 179 | INSERT INTO `championship` VALUES(168, 1960, 3, 129, 21); 180 | INSERT INTO `championship` VALUES(169, 1960, 4, 684, 18); 181 | INSERT INTO `championship` VALUES(170, 1960, 5, 683, 16); 182 | INSERT INTO `championship` VALUES(171, 1960, 6, 524, 10); 183 | INSERT INTO `championship` VALUES(172, 1960, 7, 521, 10); 184 | INSERT INTO `championship` VALUES(173, 1960, 9, 692, 8); 185 | INSERT INTO `championship` VALUES(174, 1960, 10, 706, 8); 186 | INSERT INTO `championship` VALUES(175, 1960, 11, 523, 7); 187 | INSERT INTO `championship` VALUES(176, 1960, 12, 792, 6); 188 | INSERT INTO `championship` VALUES(177, 1960, 12, 522, 6); 189 | INSERT INTO `championship` VALUES(178, 1960, 15, 614, 4); 190 | INSERT INTO `championship` VALUES(179, 1960, 15, 834, 4); 191 | INSERT INTO `championship` VALUES(180, 1960, 18, 759, 4); 192 | INSERT INTO `championship` VALUES(181, 1960, 19, 525, 3); 193 | INSERT INTO `championship` VALUES(182, 1960, 19, 487, 3); 194 | INSERT INTO `championship` VALUES(183, 1960, 19, 245, 3); 195 | INSERT INTO `championship` VALUES(184, 1960, 23, 12, 2); 196 | INSERT INTO `championship` VALUES(185, 1960, 25, 195, 1); 197 | INSERT INTO `championship` VALUES(186, 1960, 25, 710, 1); 198 | INSERT INTO `championship` VALUES(187, 1960, 25, 287, 1); 199 | INSERT INTO `championship` VALUES(188, 1961, 1, 683, 34); 200 | INSERT INTO `championship` VALUES(189, 1961, 2, 521, 33); 201 | INSERT INTO `championship` VALUES(190, 1961, 3, 129, 21); 202 | INSERT INTO `championship` VALUES(191, 1961, 4, 745, 21); 203 | INSERT INTO `championship` VALUES(192, 1961, 5, 692, 16); 204 | INSERT INTO `championship` VALUES(193, 1961, 6, 684, 12); 205 | INSERT INTO `championship` VALUES(194, 1961, 7, 706, 11); 206 | INSERT INTO `championship` VALUES(195, 1961, 8, 739, 11); 207 | INSERT INTO `championship` VALUES(196, 1961, 9, 701, 9); 208 | INSERT INTO `championship` VALUES(197, 1961, 10, 523, 6); 209 | INSERT INTO `championship` VALUES(198, 1961, 11, 733, 4); 210 | INSERT INTO `championship` VALUES(199, 1961, 12, 792, 4); 211 | INSERT INTO `championship` VALUES(200, 1961, 13, 524, 3); 212 | INSERT INTO `championship` VALUES(201, 1961, 13, 572, 3); 213 | INSERT INTO `championship` VALUES(202, 1961, 15, 759, 3); 214 | INSERT INTO `championship` VALUES(203, 1961, 15, 834, 3); 215 | INSERT INTO `championship` VALUES(204, 1961, 17, 93, 2); 216 | INSERT INTO `championship` VALUES(205, 1962, 1, 834, 42); 217 | INSERT INTO `championship` VALUES(206, 1962, 2, 706, 30); 218 | INSERT INTO `championship` VALUES(207, 1962, 3, 739, 27); 219 | INSERT INTO `championship` VALUES(208, 1962, 4, 792, 19); 220 | INSERT INTO `championship` VALUES(209, 1962, 5, 745, 15); 221 | INSERT INTO `championship` VALUES(210, 1962, 6, 683, 14); 222 | INSERT INTO `championship` VALUES(211, 1962, 7, 652, 13); 223 | INSERT INTO `championship` VALUES(212, 1962, 8, 692, 10); 224 | INSERT INTO `championship` VALUES(213, 1962, 9, 733, 9); 225 | INSERT INTO `championship` VALUES(214, 1962, 10, 681, 6); 226 | INSERT INTO `championship` VALUES(215, 1962, 11, 701, 5); 227 | INSERT INTO `championship` VALUES(216, 1962, 12, 691, 4); 228 | INSERT INTO `championship` VALUES(217, 1962, 13, 573, 4); 229 | INSERT INTO `championship` VALUES(218, 1962, 14, 614, 3); 230 | INSERT INTO `championship` VALUES(219, 1962, 15, 759, 3); 231 | INSERT INTO `championship` VALUES(220, 1962, 16, 684, 2); 232 | INSERT INTO `championship` VALUES(221, 1962, 17, 642, 2); 233 | INSERT INTO `championship` VALUES(222, 1962, 18, 656, 1); 234 | INSERT INTO `championship` VALUES(223, 1962, 18, 665, 1); 235 | INSERT INTO `championship` VALUES(224, 1963, 1, 706, 54); 236 | INSERT INTO `championship` VALUES(225, 1963, 2, 834, 33); 237 | INSERT INTO `championship` VALUES(226, 1963, 3, 692, 29); 238 | INSERT INTO `championship` VALUES(227, 1963, 4, 792, 22); 239 | INSERT INTO `championship` VALUES(228, 1963, 5, 745, 19); 240 | INSERT INTO `championship` VALUES(229, 1963, 6, 739, 17); 241 | INSERT INTO `championship` VALUES(230, 1963, 7, 733, 14); 242 | INSERT INTO `championship` VALUES(231, 1963, 8, 652, 9); 243 | INSERT INTO `championship` VALUES(232, 1963, 9, 684, 6); 244 | INSERT INTO `championship` VALUES(233, 1963, 10, 691, 6); 245 | INSERT INTO `championship` VALUES(234, 1963, 11, 759, 6); 246 | INSERT INTO `championship` VALUES(235, 1963, 12, 698, 3); 247 | INSERT INTO `championship` VALUES(236, 1963, 13, 613, 3); 248 | INSERT INTO `championship` VALUES(237, 1963, 14, 642, 2); 249 | INSERT INTO `championship` VALUES(238, 1963, 15, 681, 1); 250 | INSERT INTO `championship` VALUES(239, 1963, 15, 708, 1); 251 | INSERT INTO `championship` VALUES(240, 1963, 15, 758, 1); 252 | INSERT INTO `championship` VALUES(241, 1964, 1, 792, 40); 253 | INSERT INTO `championship` VALUES(242, 1964, 2, 834, 39); 254 | INSERT INTO `championship` VALUES(243, 1964, 3, 706, 32); 255 | INSERT INTO `championship` VALUES(244, 1964, 4, 691, 23); 256 | INSERT INTO `championship` VALUES(245, 1964, 5, 692, 23); 257 | INSERT INTO `championship` VALUES(246, 1964, 6, 745, 19); 258 | INSERT INTO `championship` VALUES(247, 1964, 7, 739, 13); 259 | INSERT INTO `championship` VALUES(248, 1964, 8, 678, 11); 260 | INSERT INTO `championship` VALUES(249, 1964, 8, 733, 11); 261 | INSERT INTO `championship` VALUES(250, 1964, 10, 758, 7); 262 | INSERT INTO `championship` VALUES(251, 1964, 11, 686, 5); 263 | INSERT INTO `championship` VALUES(252, 1964, 12, 652, 4); 264 | INSERT INTO `championship` VALUES(253, 1964, 12, 707, 4); 265 | INSERT INTO `championship` VALUES(254, 1964, 14, 684, 4); 266 | INSERT INTO `championship` VALUES(255, 1964, 15, 759, 3); 267 | INSERT INTO `championship` VALUES(256, 1964, 16, 646, 2); 268 | INSERT INTO `championship` VALUES(257, 1964, 16, 12, 2); 269 | INSERT INTO `championship` VALUES(258, 1964, 16, 853, 2); 270 | INSERT INTO `championship` VALUES(259, 1964, 19, 681, 1); 271 | INSERT INTO `championship` VALUES(260, 1964, 19, 683, 1); 272 | INSERT INTO `championship` VALUES(261, 1964, 19, 757, 1); 273 | INSERT INTO `championship` VALUES(262, 1964, 19, 810, 1); 274 | INSERT INTO `championship` VALUES(263, 1965, 1, 706, 54); 275 | INSERT INTO `championship` VALUES(264, 1965, 2, 834, 40); 276 | INSERT INTO `championship` VALUES(265, 1965, 3, 798, 33); 277 | INSERT INTO `championship` VALUES(266, 1965, 4, 745, 25); 278 | INSERT INTO `championship` VALUES(267, 1965, 5, 792, 17); 279 | INSERT INTO `championship` VALUES(268, 1965, 6, 691, 13); 280 | INSERT INTO `championship` VALUES(269, 1965, 7, 692, 11); 281 | INSERT INTO `championship` VALUES(270, 1965, 8, 707, 10); 282 | INSERT INTO `championship` VALUES(271, 1965, 9, 739, 10); 283 | INSERT INTO `championship` VALUES(272, 1965, 10, 733, 9); 284 | INSERT INTO `championship` VALUES(273, 1965, 11, 809, 5); 285 | INSERT INTO `championship` VALUES(274, 1965, 12, 758, 5); 286 | INSERT INTO `championship` VALUES(275, 1965, 13, 736, 4); 287 | INSERT INTO `championship` VALUES(276, 1965, 14, 685, 2); 288 | INSERT INTO `championship` VALUES(277, 1965, 14, 757, 2); 289 | INSERT INTO `championship` VALUES(278, 1965, 16, 724, 2); 290 | INSERT INTO `championship` VALUES(279, 1966, 1, 733, 42); 291 | INSERT INTO `championship` VALUES(280, 1966, 2, 792, 28); 292 | INSERT INTO `championship` VALUES(281, 1966, 3, 736, 22); 293 | INSERT INTO `championship` VALUES(282, 1966, 4, 809, 18); 294 | INSERT INTO `championship` VALUES(283, 1966, 5, 834, 17); 295 | INSERT INTO `championship` VALUES(284, 1966, 6, 706, 16); 296 | INSERT INTO `championship` VALUES(285, 1966, 7, 798, 14); 297 | INSERT INTO `championship` VALUES(286, 1966, 8, 693, 12); 298 | INSERT INTO `championship` VALUES(287, 1966, 9, 691, 12); 299 | INSERT INTO `championship` VALUES(288, 1966, 10, 708, 9); 300 | INSERT INTO `championship` VALUES(289, 1966, 11, 692, 5); 301 | INSERT INTO `championship` VALUES(290, 1966, 12, 707, 4); 302 | INSERT INTO `championship` VALUES(291, 1966, 12, 745, 4); 303 | INSERT INTO `championship` VALUES(292, 1966, 14, 758, 3); 304 | INSERT INTO `championship` VALUES(293, 1966, 14, 676, 3); 305 | INSERT INTO `championship` VALUES(294, 1966, 16, 739, 3); 306 | INSERT INTO `championship` VALUES(295, 1966, 17, 678, 1); 307 | INSERT INTO `championship` VALUES(296, 1966, 17, 679, 1); 308 | INSERT INTO `championship` VALUES(297, 1966, 17, 759, 1); 309 | INSERT INTO `championship` VALUES(298, 1966, 17, 686, 1); 310 | INSERT INTO `championship` VALUES(299, 1967, 1, 809, 51); 311 | INSERT INTO `championship` VALUES(300, 1967, 2, 733, 46); 312 | INSERT INTO `championship` VALUES(301, 1967, 3, 706, 41); 313 | INSERT INTO `championship` VALUES(302, 1967, 4, 853, 20); 314 | INSERT INTO `championship` VALUES(303, 1967, 5, 792, 20); 315 | INSERT INTO `championship` VALUES(304, 1967, 6, 757, 15); 316 | INSERT INTO `championship` VALUES(305, 1967, 7, 834, 15); 317 | INSERT INTO `championship` VALUES(306, 1967, 8, 745, 13); 318 | INSERT INTO `championship` VALUES(307, 1967, 9, 798, 10); 319 | INSERT INTO `championship` VALUES(308, 1967, 10, 707, 9); 320 | INSERT INTO `championship` VALUES(309, 1967, 11, 782, 6); 321 | INSERT INTO `championship` VALUES(310, 1967, 12, 736, 6); 322 | INSERT INTO `championship` VALUES(311, 1967, 12, 758, 6); 323 | INSERT INTO `championship` VALUES(312, 1967, 14, 739, 3); 324 | INSERT INTO `championship` VALUES(313, 1967, 15, 759, 3); 325 | INSERT INTO `championship` VALUES(314, 1967, 16, 693, 2); 326 | INSERT INTO `championship` VALUES(315, 1967, 16, 694, 2); 327 | INSERT INTO `championship` VALUES(316, 1967, 16, 686, 2); 328 | INSERT INTO `championship` VALUES(317, 1967, 19, 708, 1); 329 | INSERT INTO `championship` VALUES(318, 1967, 20, 913, 1); 330 | INSERT INTO `championship` VALUES(319, 1967, 20, 695, 1); 331 | INSERT INTO `championship` VALUES(320, 1968, 1, 834, 48); 332 | INSERT INTO `championship` VALUES(321, 1968, 2, 798, 36); 333 | INSERT INTO `championship` VALUES(322, 1968, 3, 809, 33); 334 | INSERT INTO `championship` VALUES(323, 1968, 4, 913, 27); 335 | INSERT INTO `championship` VALUES(324, 1968, 5, 739, 22); 336 | INSERT INTO `championship` VALUES(325, 1968, 6, 757, 18); 337 | INSERT INTO `championship` VALUES(326, 1968, 7, 792, 12); 338 | INSERT INTO `championship` VALUES(327, 1968, 8, 758, 12); 339 | INSERT INTO `championship` VALUES(328, 1968, 9, 811, 11); 340 | INSERT INTO `championship` VALUES(329, 1968, 10, 853, 10); 341 | INSERT INTO `championship` VALUES(330, 1968, 11, 706, 9); 342 | INSERT INTO `championship` VALUES(331, 1968, 12, 736, 8); 343 | INSERT INTO `championship` VALUES(332, 1968, 13, 724, 6); 344 | INSERT INTO `championship` VALUES(333, 1968, 14, 708, 6); 345 | INSERT INTO `championship` VALUES(334, 1968, 15, 878, 6); 346 | INSERT INTO `championship` VALUES(335, 1968, 16, 738, 6); 347 | INSERT INTO `championship` VALUES(336, 1968, 17, 710, 5); 348 | INSERT INTO `championship` VALUES(337, 1968, 18, 772, 5); 349 | INSERT INTO `championship` VALUES(338, 1968, 19, 818, 4); 350 | INSERT INTO `championship` VALUES(339, 1968, 20, 737, 4); 351 | INSERT INTO `championship` VALUES(340, 1968, 21, 745, 3); 352 | INSERT INTO `championship` VALUES(341, 1968, 22, 759, 3); 353 | INSERT INTO `championship` VALUES(342, 1968, 23, 773, 2); 354 | INSERT INTO `championship` VALUES(343, 1968, 24, 733, 2); 355 | INSERT INTO `championship` VALUES(344, 1969, 1, 798, 63); 356 | INSERT INTO `championship` VALUES(345, 1969, 2, 913, 37); 357 | INSERT INTO `championship` VALUES(346, 1969, 3, 739, 26); 358 | INSERT INTO `championship` VALUES(347, 1969, 4, 736, 22); 359 | INSERT INTO `championship` VALUES(348, 1969, 5, 811, 21); 360 | INSERT INTO `championship` VALUES(349, 1969, 6, 809, 20); 361 | INSERT INTO `championship` VALUES(350, 1969, 7, 834, 19); 362 | INSERT INTO `championship` VALUES(351, 1969, 8, 737, 16); 363 | INSERT INTO `championship` VALUES(352, 1969, 9, 758, 15); 364 | INSERT INTO `championship` VALUES(353, 1969, 10, 733, 14); 365 | INSERT INTO `championship` VALUES(354, 1969, 11, 792, 6); 366 | INSERT INTO `championship` VALUES(355, 1969, 12, 853, 4); 367 | INSERT INTO `championship` VALUES(356, 1969, 13, 724, 3); 368 | INSERT INTO `championship` VALUES(357, 1969, 14, 772, 3); 369 | INSERT INTO `championship` VALUES(358, 1969, 15, 757, 3); 370 | INSERT INTO `championship` VALUES(359, 1969, 16, 773, 1); 371 | INSERT INTO `championship` VALUES(360, 1969, 16, 738, 1); 372 | INSERT INTO `championship` VALUES(361, 1969, 16, 878, 1); 373 | INSERT INTO `championship` VALUES(362, 1970, 1, 736, 45); 374 | INSERT INTO `championship` VALUES(363, 1970, 2, 913, 40); 375 | INSERT INTO `championship` VALUES(364, 1970, 3, 916, 33); 376 | INSERT INTO `championship` VALUES(365, 1970, 4, 809, 27); 377 | INSERT INTO `championship` VALUES(366, 1970, 5, 733, 25); 378 | INSERT INTO `championship` VALUES(367, 1970, 6, 798, 25); 379 | INSERT INTO `championship` VALUES(368, 1970, 7, 757, 23); 380 | INSERT INTO `championship` VALUES(369, 1970, 8, 853, 23); 381 | INSERT INTO `championship` VALUES(370, 1970, 9, 811, 16); 382 | INSERT INTO `championship` VALUES(371, 1970, 10, 917, 12); 383 | INSERT INTO `championship` VALUES(372, 1970, 11, 896, 10); 384 | INSERT INTO `championship` VALUES(373, 1970, 12, 856, 8); 385 | INSERT INTO `championship` VALUES(374, 1970, 13, 834, 7); 386 | INSERT INTO `championship` VALUES(375, 1970, 14, 739, 6); 387 | INSERT INTO `championship` VALUES(376, 1970, 15, 943, 4); 388 | INSERT INTO `championship` VALUES(377, 1970, 16, 823, 4); 389 | INSERT INTO `championship` VALUES(378, 1970, 17, 744, 3); 390 | INSERT INTO `championship` VALUES(379, 1970, 18, 792, 3); 391 | INSERT INTO `championship` VALUES(380, 1970, 19, 738, 2); 392 | INSERT INTO `championship` VALUES(381, 1970, 19, 734, 2); 393 | INSERT INTO `championship` VALUES(382, 1970, 21, 878, 2); 394 | INSERT INTO `championship` VALUES(383, 1970, 22, 745, 1); 395 | INSERT INTO `championship` VALUES(384, 1970, 23, 827, 1); 396 | INSERT INTO `championship` VALUES(385, 1970, 24, 797, 1); 397 | INSERT INTO `championship` VALUES(386, 1970, 25, 826, 1); 398 | INSERT INTO `championship` VALUES(387, 1971, 1, 798, 62); 399 | INSERT INTO `championship` VALUES(388, 1971, 2, 891, 33); 400 | INSERT INTO `championship` VALUES(389, 1971, 3, 797, 26); 401 | INSERT INTO `championship` VALUES(390, 1971, 4, 913, 19); 402 | INSERT INTO `championship` VALUES(391, 1971, 5, 758, 19); 403 | INSERT INTO `championship` VALUES(392, 1971, 6, 917, 16); 404 | INSERT INTO `championship` VALUES(393, 1971, 7, 916, 13); 405 | INSERT INTO `championship` VALUES(394, 1971, 8, 943, 12); 406 | INSERT INTO `championship` VALUES(395, 1971, 9, 757, 9); 407 | INSERT INTO `championship` VALUES(396, 1971, 10, 853, 9); 408 | INSERT INTO `championship` VALUES(397, 1971, 11, 809, 9); 409 | INSERT INTO `championship` VALUES(398, 1971, 12, 823, 9); 410 | INSERT INTO `championship` VALUES(399, 1971, 13, 827, 9); 411 | INSERT INTO `championship` VALUES(400, 1971, 14, 819, 5); 412 | INSERT INTO `championship` VALUES(401, 1971, 15, 812, 5); 413 | INSERT INTO `championship` VALUES(402, 1971, 16, 856, 4); 414 | INSERT INTO `championship` VALUES(403, 1971, 17, 833, 4); 415 | INSERT INTO `championship` VALUES(404, 1971, 18, 896, 3); 416 | INSERT INTO `championship` VALUES(405, 1971, 18, 792, 3); 417 | INSERT INTO `championship` VALUES(406, 1971, 20, 810, 3); 418 | INSERT INTO `championship` VALUES(407, 1971, 21, 834, 2); 419 | INSERT INTO `championship` VALUES(408, 1971, 22, 811, 1); 420 | INSERT INTO `championship` VALUES(409, 1972, 1, 917, 61); 421 | INSERT INTO `championship` VALUES(410, 1972, 2, 798, 45); 422 | INSERT INTO `championship` VALUES(411, 1972, 3, 809, 39); 423 | INSERT INTO `championship` VALUES(412, 1972, 4, 913, 27); 424 | INSERT INTO `championship` VALUES(413, 1972, 5, 813, 23); 425 | INSERT INTO `championship` VALUES(414, 1972, 6, 797, 15); 426 | INSERT INTO `championship` VALUES(415, 1972, 7, 916, 15); 427 | INSERT INTO `championship` VALUES(416, 1972, 8, 810, 13); 428 | INSERT INTO `championship` VALUES(417, 1972, 9, 853, 12); 429 | INSERT INTO `championship` VALUES(418, 1972, 10, 891, 12); 430 | INSERT INTO `championship` VALUES(419, 1972, 11, 811, 9); 431 | INSERT INTO `championship` VALUES(420, 1972, 12, 943, 4); 432 | INSERT INTO `championship` VALUES(421, 1972, 13, 818, 4); 433 | INSERT INTO `championship` VALUES(422, 1972, 14, 834, 4); 434 | INSERT INTO `championship` VALUES(423, 1972, 15, 812, 4); 435 | INSERT INTO `championship` VALUES(424, 1972, 16, 803, 3); 436 | INSERT INTO `championship` VALUES(425, 1972, 17, 866, 3); 437 | INSERT INTO `championship` VALUES(426, 1972, 18, 935, 3); 438 | INSERT INTO `championship` VALUES(427, 1972, 19, 819, 2); 439 | INSERT INTO `championship` VALUES(428, 1972, 20, 827, 1); 440 | INSERT INTO `championship` VALUES(429, 1972, 20, 903, 1); 441 | INSERT INTO `championship` VALUES(430, 1973, 1, 798, 71); 442 | INSERT INTO `championship` VALUES(431, 1973, 2, 917, 55); 443 | INSERT INTO `championship` VALUES(432, 1973, 3, 891, 52); 444 | INSERT INTO `championship` VALUES(433, 1973, 4, 797, 47); 445 | INSERT INTO `championship` VALUES(434, 1973, 5, 813, 38); 446 | INSERT INTO `championship` VALUES(435, 1973, 6, 809, 26); 447 | INSERT INTO `championship` VALUES(436, 1973, 7, 935, 16); 448 | INSERT INTO `championship` VALUES(437, 1973, 8, 904, 14); 449 | INSERT INTO `championship` VALUES(438, 1973, 9, 913, 12); 450 | INSERT INTO `championship` VALUES(439, 1973, 10, 811, 9); 451 | INSERT INTO `championship` VALUES(440, 1973, 11, 866, 7); 452 | INSERT INTO `championship` VALUES(441, 1973, 12, 903, 6); 453 | INSERT INTO `championship` VALUES(442, 1973, 13, 802, 5); 454 | INSERT INTO `championship` VALUES(443, 1973, 14, 878, 4); 455 | INSERT INTO `championship` VALUES(444, 1973, 15, 803, 3); 456 | INSERT INTO `championship` VALUES(445, 1973, 16, 835, 3); 457 | INSERT INTO `championship` VALUES(446, 1973, 17, 961, 2); 458 | INSERT INTO `championship` VALUES(447, 1973, 18, 916, 2); 459 | INSERT INTO `championship` VALUES(448, 1973, 19, 853, 1); 460 | INSERT INTO `championship` VALUES(449, 1973, 20, 812, 1); 461 | INSERT INTO `championship` VALUES(450, 1973, 20, 844, 1); 462 | INSERT INTO `championship` VALUES(451, 1974, 1, 917, 55); 463 | INSERT INTO `championship` VALUES(452, 1974, 2, 916, 52); 464 | INSERT INTO `championship` VALUES(453, 1974, 3, 919, 45); 465 | INSERT INTO `championship` VALUES(454, 1974, 4, 961, 38); 466 | INSERT INTO `championship` VALUES(455, 1974, 5, 891, 35); 467 | INSERT INTO `championship` VALUES(456, 1974, 6, 935, 32); 468 | INSERT INTO `championship` VALUES(457, 1974, 7, 809, 20); 469 | INSERT INTO `championship` VALUES(458, 1974, 8, 904, 15); 470 | INSERT INTO `championship` VALUES(459, 1974, 9, 920, 14); 471 | INSERT INTO `championship` VALUES(460, 1974, 10, 810, 12); 472 | INSERT INTO `championship` VALUES(461, 1974, 11, 913, 12); 473 | INSERT INTO `championship` VALUES(462, 1974, 12, 866, 11); 474 | INSERT INTO `championship` VALUES(463, 1974, 13, 811, 10); 475 | INSERT INTO `championship` VALUES(464, 1974, 14, 952, 6); 476 | INSERT INTO `championship` VALUES(465, 1974, 15, 965, 6); 477 | INSERT INTO `championship` VALUES(466, 1974, 16, 905, 5); 478 | INSERT INTO `championship` VALUES(467, 1974, 17, 903, 4); 479 | INSERT INTO `championship` VALUES(468, 1974, 18, 834, 1); 480 | INSERT INTO `championship` VALUES(469, 1974, 19, 925, 1); 481 | INSERT INTO `championship` VALUES(470, 1974, 19, 867, 1); 482 | INSERT INTO `championship` VALUES(471, 1975, 1, 961, 64.5); 483 | INSERT INTO `championship` VALUES(472, 1975, 2, 917, 45); 484 | INSERT INTO `championship` VALUES(473, 1975, 3, 935, 37); 485 | INSERT INTO `championship` VALUES(474, 1975, 4, 904, 33); 486 | INSERT INTO `championship` VALUES(475, 1975, 5, 916, 25); 487 | INSERT INTO `championship` VALUES(476, 1975, 6, 866, 24); 488 | INSERT INTO `championship` VALUES(477, 1975, 7, 919, 20); 489 | INSERT INTO `championship` VALUES(478, 1975, 8, 936, 20); 490 | INSERT INTO `championship` VALUES(479, 1975, 9, 920, 12); 491 | INSERT INTO `championship` VALUES(480, 1975, 10, 867, 8); 492 | INSERT INTO `championship` VALUES(481, 1975, 11, 925, 6.5); 493 | INSERT INTO `championship` VALUES(482, 1975, 12, 891, 6); 494 | INSERT INTO `championship` VALUES(483, 1975, 13, 966, 6); 495 | INSERT INTO `championship` VALUES(484, 1975, 14, 943, 5); 496 | INSERT INTO `championship` VALUES(485, 1975, 15, 833, 4); 497 | INSERT INTO `championship` VALUES(486, 1975, 16, 913, 3); 498 | INSERT INTO `championship` VALUES(487, 1975, 17, 970, 2); 499 | INSERT INTO `championship` VALUES(488, 1975, 18, 952, 1.5); 500 | INSERT INTO `championship` VALUES(489, 1975, 19, 840, 1); 501 | INSERT INTO `championship` VALUES(490, 1975, 20, 844, 1); 502 | INSERT INTO `championship` VALUES(491, 1975, 21, 850, 0.5); 503 | INSERT INTO `championship` VALUES(492, 1976, 1, 904, 69); 504 | INSERT INTO `championship` VALUES(493, 1976, 2, 961, 68); 505 | INSERT INTO `championship` VALUES(494, 1976, 3, 919, 49); 506 | INSERT INTO `championship` VALUES(495, 1976, 4, 920, 39); 507 | INSERT INTO `championship` VALUES(496, 1976, 5, 916, 31); 508 | INSERT INTO `championship` VALUES(497, 1976, 6, 943, 22); 509 | INSERT INTO `championship` VALUES(498, 1976, 7, 965, 20); 510 | INSERT INTO `championship` VALUES(499, 1976, 8, 966, 20); 511 | INSERT INTO `championship` VALUES(500, 1976, 9, 936, 19); 512 | INSERT INTO `championship` VALUES(501, 1976, 10, 871, 11); 513 | INSERT INTO `championship` VALUES(502, 1976, 11, 891, 10); 514 | INSERT INTO `championship` VALUES(503, 1976, 12, 867, 10); 515 | INSERT INTO `championship` VALUES(504, 1976, 13, 905, 8); 516 | INSERT INTO `championship` VALUES(505, 1976, 14, 866, 7); 517 | INSERT INTO `championship` VALUES(506, 1976, 15, 970, 7); 518 | INSERT INTO `championship` VALUES(507, 1976, 16, 935, 3); 519 | INSERT INTO `championship` VALUES(508, 1976, 17, 917, 3); 520 | INSERT INTO `championship` VALUES(509, 1976, 18, 853, 2); 521 | INSERT INTO `championship` VALUES(510, 1976, 19, 925, 1); 522 | INSERT INTO `championship` VALUES(511, 1976, 19, 896, 1); 523 | INSERT INTO `championship` VALUES(512, 1977, 1, 961, 72); 524 | INSERT INTO `championship` VALUES(513, 1977, 2, 919, 55); 525 | INSERT INTO `championship` VALUES(514, 1977, 3, 943, 47); 526 | INSERT INTO `championship` VALUES(515, 1977, 4, 935, 42); 527 | INSERT INTO `championship` VALUES(516, 1977, 5, 904, 40); 528 | INSERT INTO `championship` VALUES(517, 1977, 6, 936, 25); 529 | INSERT INTO `championship` VALUES(518, 1977, 7, 970, 22); 530 | INSERT INTO `championship` VALUES(519, 1977, 8, 871, 20); 531 | INSERT INTO `championship` VALUES(520, 1977, 9, 920, 20); 532 | INSERT INTO `championship` VALUES(521, 1977, 10, 966, 18); 533 | INSERT INTO `championship` VALUES(522, 1977, 11, 905, 12); 534 | INSERT INTO `championship` VALUES(523, 1977, 12, 917, 11); 535 | INSERT INTO `championship` VALUES(524, 1977, 13, 965, 9); 536 | INSERT INTO `championship` VALUES(525, 1977, 14, 891, 7); 537 | INSERT INTO `championship` VALUES(526, 1977, 15, 866, 6); 538 | INSERT INTO `championship` VALUES(527, 1977, 16, 925, 6); 539 | INSERT INTO `championship` VALUES(528, 1977, 17, 916, 5); 540 | INSERT INTO `championship` VALUES(529, 1977, 18, 971, 5); 541 | INSERT INTO `championship` VALUES(530, 1977, 19, 869, 1); 542 | INSERT INTO `championship` VALUES(531, 1977, 19, 952, 1); 543 | INSERT INTO `championship` VALUES(532, 1977, 21, 1020, 1); 544 | INSERT INTO `championship` VALUES(533, 1978, 1, 943, 64); 545 | INSERT INTO `championship` VALUES(534, 1978, 2, 891, 51); 546 | INSERT INTO `championship` VALUES(535, 1978, 3, 935, 48); 547 | INSERT INTO `championship` VALUES(536, 1978, 4, 961, 44); 548 | INSERT INTO `championship` VALUES(537, 1978, 5, 920, 34); 549 | INSERT INTO `championship` VALUES(538, 1978, 6, 965, 25); 550 | INSERT INTO `championship` VALUES(539, 1978, 7, 919, 24); 551 | INSERT INTO `championship` VALUES(540, 1978, 8, 966, 19); 552 | INSERT INTO `championship` VALUES(541, 1978, 9, 917, 17); 553 | INSERT INTO `championship` VALUES(542, 1978, 10, 942, 17); 554 | INSERT INTO `championship` VALUES(543, 1978, 11, 1020, 11); 555 | INSERT INTO `championship` VALUES(544, 1978, 12, 970, 11); 556 | INSERT INTO `championship` VALUES(545, 1978, 13, 904, 8); 557 | INSERT INTO `championship` VALUES(546, 1978, 14, 971, 8); 558 | INSERT INTO `championship` VALUES(547, 1978, 15, 939, 7); 559 | INSERT INTO `championship` VALUES(548, 1978, 16, 916, 4); 560 | INSERT INTO `championship` VALUES(549, 1978, 17, 933, 3); 561 | INSERT INTO `championship` VALUES(550, 1978, 18, 905, 2); 562 | INSERT INTO `championship` VALUES(551, 1978, 19, 925, 1); 563 | INSERT INTO `championship` VALUES(552, 1978, 19, 926, 1); 564 | INSERT INTO `championship` VALUES(553, 1978, 19, 937, 1); 565 | INSERT INTO `championship` VALUES(554, 1979, 1, 919, 51); 566 | INSERT INTO `championship` VALUES(555, 1979, 2, 942, 47); 567 | INSERT INTO `championship` VALUES(556, 1979, 3, 970, 40); 568 | INSERT INTO `championship` VALUES(557, 1979, 4, 966, 36); 569 | INSERT INTO `championship` VALUES(558, 1979, 5, 916, 29); 570 | INSERT INTO `championship` VALUES(559, 1979, 6, 920, 20); 571 | INSERT INTO `championship` VALUES(560, 1979, 7, 935, 20); 572 | INSERT INTO `championship` VALUES(561, 1979, 8, 986, 17); 573 | INSERT INTO `championship` VALUES(562, 1979, 9, 965, 15); 574 | INSERT INTO `championship` VALUES(563, 1979, 10, 943, 14); 575 | INSERT INTO `championship` VALUES(564, 1979, 11, 939, 14); 576 | INSERT INTO `championship` VALUES(565, 1979, 12, 952, 14); 577 | INSERT INTO `championship` VALUES(566, 1979, 13, 933, 9); 578 | INSERT INTO `championship` VALUES(567, 1979, 14, 961, 4); 579 | INSERT INTO `championship` VALUES(568, 1979, 15, 936, 3); 580 | INSERT INTO `championship` VALUES(569, 1979, 16, 1000, 3); 581 | INSERT INTO `championship` VALUES(570, 1979, 17, 967, 3); 582 | INSERT INTO `championship` VALUES(571, 1979, 18, 913, 3); 583 | INSERT INTO `championship` VALUES(572, 1979, 19, 1020, 2); 584 | INSERT INTO `championship` VALUES(573, 1979, 20, 905, 2); 585 | INSERT INTO `championship` VALUES(574, 1979, 21, 917, 1); 586 | INSERT INTO `championship` VALUES(575, 1980, 1, 970, 67); 587 | INSERT INTO `championship` VALUES(576, 1980, 2, 1000, 54); 588 | INSERT INTO `championship` VALUES(577, 1980, 3, 935, 42); 589 | INSERT INTO `championship` VALUES(578, 1980, 4, 966, 34); 590 | INSERT INTO `championship` VALUES(579, 1980, 5, 939, 32); 591 | INSERT INTO `championship` VALUES(580, 1980, 6, 986, 29); 592 | INSERT INTO `championship` VALUES(581, 1980, 7, 967, 13); 593 | INSERT INTO `championship` VALUES(582, 1980, 8, 933, 9); 594 | INSERT INTO `championship` VALUES(583, 1980, 9, 1020, 7); 595 | INSERT INTO `championship` VALUES(584, 1980, 10, 969, 6); 596 | INSERT INTO `championship` VALUES(585, 1980, 11, 965, 6); 597 | INSERT INTO `championship` VALUES(586, 1980, 11, 937, 6); 598 | INSERT INTO `championship` VALUES(587, 1980, 13, 942, 6); 599 | INSERT INTO `championship` VALUES(588, 1980, 14, 952, 6); 600 | INSERT INTO `championship` VALUES(589, 1980, 15, 917, 5); 601 | INSERT INTO `championship` VALUES(590, 1980, 16, 1018, 5); 602 | INSERT INTO `championship` VALUES(591, 1980, 17, 936, 4); 603 | INSERT INTO `championship` VALUES(592, 1980, 18, 999, 4); 604 | INSERT INTO `championship` VALUES(593, 1980, 19, 919, 2); 605 | INSERT INTO `championship` VALUES(594, 1980, 20, 943, 1); 606 | INSERT INTO `championship` VALUES(595, 1980, 20, 926, 1); 607 | INSERT INTO `championship` VALUES(596, 1981, 1, 1000, 50); 608 | INSERT INTO `championship` VALUES(597, 1981, 2, 935, 49); 609 | INSERT INTO `championship` VALUES(598, 1981, 3, 970, 46); 610 | INSERT INTO `championship` VALUES(599, 1981, 4, 966, 44); 611 | INSERT INTO `championship` VALUES(600, 1981, 5, 1018, 43); 612 | INSERT INTO `championship` VALUES(601, 1981, 6, 965, 27); 613 | INSERT INTO `championship` VALUES(602, 1981, 7, 942, 25); 614 | INSERT INTO `championship` VALUES(603, 1981, 8, 967, 14); 615 | INSERT INTO `championship` VALUES(604, 1981, 9, 986, 11); 616 | INSERT INTO `championship` VALUES(605, 1981, 10, 926, 11); 617 | INSERT INTO `championship` VALUES(606, 1981, 11, 1020, 10); 618 | INSERT INTO `championship` VALUES(607, 1981, 12, 983, 10); 619 | INSERT INTO `championship` VALUES(608, 1981, 13, 939, 9); 620 | INSERT INTO `championship` VALUES(609, 1981, 14, 1054, 8); 621 | INSERT INTO `championship` VALUES(610, 1981, 15, 999, 7); 622 | INSERT INTO `championship` VALUES(611, 1981, 16, 972, 4); 623 | INSERT INTO `championship` VALUES(612, 1981, 17, 943, 3); 624 | INSERT INTO `championship` VALUES(613, 1981, 18, 938, 1); 625 | INSERT INTO `championship` VALUES(614, 1981, 18, 971, 1); 626 | INSERT INTO `championship` VALUES(615, 1981, 18, 950, 1); 627 | INSERT INTO `championship` VALUES(616, 1981, 18, 1039, 1); 628 | INSERT INTO `championship` VALUES(617, 1982, 1, 969, 44); 629 | INSERT INTO `championship` VALUES(618, 1982, 2, 939, 39); 630 | INSERT INTO `championship` VALUES(619, 1982, 3, 965, 39); 631 | INSERT INTO `championship` VALUES(620, 1982, 4, 1018, 34); 632 | INSERT INTO `championship` VALUES(621, 1982, 5, 961, 30); 633 | INSERT INTO `championship` VALUES(622, 1982, 6, 986, 28); 634 | INSERT INTO `championship` VALUES(623, 1982, 7, 971, 25); 635 | INSERT INTO `championship` VALUES(624, 1982, 8, 1037, 25); 636 | INSERT INTO `championship` VALUES(625, 1982, 9, 967, 23); 637 | INSERT INTO `championship` VALUES(626, 1982, 10, 1020, 21); 638 | INSERT INTO `championship` VALUES(627, 1982, 11, 1000, 20); 639 | INSERT INTO `championship` VALUES(628, 1982, 12, 983, 15); 640 | INSERT INTO `championship` VALUES(629, 1982, 13, 937, 8); 641 | INSERT INTO `championship` VALUES(630, 1982, 14, 1054, 7); 642 | INSERT INTO `championship` VALUES(631, 1982, 15, 942, 6); 643 | INSERT INTO `championship` VALUES(632, 1982, 15, 935, 6); 644 | INSERT INTO `championship` VALUES(633, 1982, 17, 966, 5); 645 | INSERT INTO `championship` VALUES(634, 1982, 17, 1039, 5); 646 | INSERT INTO `championship` VALUES(635, 1982, 19, 943, 4); 647 | INSERT INTO `championship` VALUES(636, 1982, 20, 952, 3); 648 | INSERT INTO `championship` VALUES(637, 1982, 21, 972, 3); 649 | INSERT INTO `championship` VALUES(638, 1982, 22, 959, 2); 650 | INSERT INTO `championship` VALUES(639, 1982, 22, 950, 2); 651 | INSERT INTO `championship` VALUES(640, 1982, 22, 999, 2); 652 | INSERT INTO `championship` VALUES(641, 1982, 25, 962, 2); 653 | INSERT INTO `championship` VALUES(642, 1982, 26, 948, 1); 654 | INSERT INTO `championship` VALUES(643, 1983, 1, 1000, 59); 655 | INSERT INTO `championship` VALUES(644, 1983, 2, 1018, 57); 656 | INSERT INTO `championship` VALUES(645, 1983, 3, 986, 49); 657 | INSERT INTO `championship` VALUES(646, 1983, 4, 971, 40); 658 | INSERT INTO `championship` VALUES(647, 1983, 5, 969, 27); 659 | INSERT INTO `championship` VALUES(648, 1983, 6, 965, 22); 660 | INSERT INTO `championship` VALUES(649, 1983, 7, 983, 22); 661 | INSERT INTO `championship` VALUES(650, 1983, 8, 1039, 15); 662 | INSERT INTO `championship` VALUES(651, 1983, 9, 1020, 13); 663 | INSERT INTO `championship` VALUES(652, 1983, 10, 961, 12); 664 | INSERT INTO `championship` VALUES(653, 1983, 11, 966, 11); 665 | INSERT INTO `championship` VALUES(654, 1983, 12, 1037, 10); 666 | INSERT INTO `championship` VALUES(655, 1983, 13, 1054, 10); 667 | INSERT INTO `championship` VALUES(656, 1983, 14, 1019, 9); 668 | INSERT INTO `championship` VALUES(657, 1983, 15, 972, 4); 669 | INSERT INTO `championship` VALUES(658, 1983, 16, 962, 3); 670 | INSERT INTO `championship` VALUES(659, 1983, 17, 967, 2); 671 | INSERT INTO `championship` VALUES(660, 1983, 17, 949, 2); 672 | INSERT INTO `championship` VALUES(661, 1983, 19, 955, 1); 673 | INSERT INTO `championship` VALUES(662, 1983, 19, 999, 1); 674 | INSERT INTO `championship` VALUES(663, 1984, 1, 961, 72); 675 | INSERT INTO `championship` VALUES(664, 1984, 2, 1018, 71.5); 676 | INSERT INTO `championship` VALUES(665, 1984, 3, 967, 34); 677 | INSERT INTO `championship` VALUES(666, 1984, 4, 1037, 30.5); 678 | INSERT INTO `championship` VALUES(667, 1984, 5, 1000, 29); 679 | INSERT INTO `championship` VALUES(668, 1984, 6, 986, 27); 680 | INSERT INTO `championship` VALUES(669, 1984, 7, 1019, 23); 681 | INSERT INTO `championship` VALUES(670, 1984, 8, 969, 20.5); 682 | INSERT INTO `championship` VALUES(671, 1984, 9, 1054, 13); 683 | INSERT INTO `championship` VALUES(672, 1984, 9, 1031, 13); 684 | INSERT INTO `championship` VALUES(673, 1984, 11, 971, 11); 685 | INSERT INTO `championship` VALUES(674, 1984, 12, 976, 9); 686 | INSERT INTO `championship` VALUES(675, 1984, 13, 1020, 8); 687 | INSERT INTO `championship` VALUES(676, 1984, 14, 966, 5); 688 | INSERT INTO `championship` VALUES(677, 1984, 15, 1024, 5); 689 | INSERT INTO `championship` VALUES(678, 1984, 16, 1004, 3); 690 | INSERT INTO `championship` VALUES(679, 1984, 16, 983, 3); 691 | INSERT INTO `championship` VALUES(680, 1984, 18, 1039, 3); 692 | INSERT INTO `championship` VALUES(681, 1984, 19, 985, 2); 693 | INSERT INTO `championship` VALUES(682, 1984, 19, 956, 2); 694 | INSERT INTO `championship` VALUES(683, 1984, 21, 972, 1); 695 | INSERT INTO `championship` VALUES(684, 1984, 21, 1063, 1); 696 | INSERT INTO `championship` VALUES(685, 1985, 1, 1018, 73); 697 | INSERT INTO `championship` VALUES(686, 1985, 2, 1037, 53); 698 | INSERT INTO `championship` VALUES(687, 1985, 3, 969, 40); 699 | INSERT INTO `championship` VALUES(688, 1985, 4, 1031, 38); 700 | INSERT INTO `championship` VALUES(689, 1985, 5, 967, 33); 701 | INSERT INTO `championship` VALUES(690, 1985, 6, 1054, 31); 702 | INSERT INTO `championship` VALUES(691, 1985, 7, 1004, 26); 703 | INSERT INTO `championship` VALUES(692, 1985, 8, 1000, 21); 704 | INSERT INTO `championship` VALUES(693, 1985, 9, 966, 16); 705 | INSERT INTO `championship` VALUES(694, 1985, 10, 961, 14); 706 | INSERT INTO `championship` VALUES(695, 1985, 11, 1024, 11); 707 | INSERT INTO `championship` VALUES(696, 1985, 12, 971, 11); 708 | INSERT INTO `championship` VALUES(697, 1985, 13, 972, 5); 709 | INSERT INTO `championship` VALUES(698, 1985, 14, 1019, 5); 710 | INSERT INTO `championship` VALUES(699, 1985, 15, 978, 4); 711 | INSERT INTO `championship` VALUES(700, 1985, 16, 963, 4); 712 | INSERT INTO `championship` VALUES(701, 1985, 17, 986, 3); 713 | INSERT INTO `championship` VALUES(702, 1985, 18, 1022, 3); 714 | INSERT INTO `championship` VALUES(703, 1985, 18, 1039, 3); 715 | INSERT INTO `championship` VALUES(704, 1985, 20, 1063, 3); 716 | INSERT INTO `championship` VALUES(705, 1986, 1, 1018, 72); 717 | INSERT INTO `championship` VALUES(706, 1986, 2, 1054, 70); 718 | INSERT INTO `championship` VALUES(707, 1986, 3, 1000, 69); 719 | INSERT INTO `championship` VALUES(708, 1986, 4, 1031, 55); 720 | INSERT INTO `championship` VALUES(709, 1986, 5, 1004, 23); 721 | INSERT INTO `championship` VALUES(710, 1986, 6, 969, 22); 722 | INSERT INTO `championship` VALUES(711, 1986, 7, 1063, 17); 723 | INSERT INTO `championship` VALUES(712, 1986, 8, 966, 14); 724 | INSERT INTO `championship` VALUES(713, 1986, 9, 1037, 14); 725 | INSERT INTO `championship` VALUES(714, 1986, 10, 986, 14); 726 | INSERT INTO `championship` VALUES(715, 1986, 11, 1059, 8); 727 | INSERT INTO `championship` VALUES(716, 1986, 12, 970, 4); 728 | INSERT INTO `championship` VALUES(717, 1986, 13, 978, 3); 729 | INSERT INTO `championship` VALUES(718, 1986, 13, 968, 3); 730 | INSERT INTO `championship` VALUES(719, 1986, 15, 976, 2); 731 | INSERT INTO `championship` VALUES(720, 1986, 15, 971, 2); 732 | INSERT INTO `championship` VALUES(721, 1986, 17, 1020, 2); 733 | INSERT INTO `championship` VALUES(722, 1986, 18, 1041, 1); 734 | INSERT INTO `championship` VALUES(723, 1986, 18, 982, 1); 735 | INSERT INTO `championship` VALUES(724, 1987, 1, 1000, 73); 736 | INSERT INTO `championship` VALUES(725, 1987, 2, 1054, 61); 737 | INSERT INTO `championship` VALUES(726, 1987, 3, 1031, 57); 738 | INSERT INTO `championship` VALUES(727, 1987, 4, 1018, 46); 739 | INSERT INTO `championship` VALUES(728, 1987, 5, 1063, 36); 740 | INSERT INTO `championship` VALUES(729, 1987, 6, 1004, 30); 741 | INSERT INTO `championship` VALUES(730, 1987, 7, 1037, 17); 742 | INSERT INTO `championship` VALUES(731, 1987, 8, 1024, 16); 743 | INSERT INTO `championship` VALUES(732, 1987, 9, 976, 12); 744 | INSERT INTO `championship` VALUES(733, 1987, 10, 983, 8); 745 | INSERT INTO `championship` VALUES(734, 1987, 11, 981, 7); 746 | INSERT INTO `championship` VALUES(735, 1987, 12, 1001, 7); 747 | INSERT INTO `championship` VALUES(736, 1987, 13, 1020, 6); 748 | INSERT INTO `championship` VALUES(737, 1987, 14, 1039, 4); 749 | INSERT INTO `championship` VALUES(738, 1987, 15, 978, 4); 750 | INSERT INTO `championship` VALUES(739, 1987, 16, 1019, 3); 751 | INSERT INTO `championship` VALUES(740, 1987, 17, 1041, 3); 752 | INSERT INTO `championship` VALUES(741, 1987, 18, 1042, 2); 753 | INSERT INTO `championship` VALUES(742, 1987, 18, 1059, 2); 754 | INSERT INTO `championship` VALUES(743, 1987, 20, 1048, 1); 755 | INSERT INTO `championship` VALUES(744, 1987, 21, 986, 1); 756 | INSERT INTO `championship` VALUES(745, 1987, 22, 1022, 1); 757 | INSERT INTO `championship` VALUES(746, 1988, 1, 1031, 90); 758 | INSERT INTO `championship` VALUES(747, 1988, 2, 1018, 87); 759 | INSERT INTO `championship` VALUES(748, 1988, 3, 1063, 41); 760 | INSERT INTO `championship` VALUES(749, 1988, 4, 1024, 27); 761 | INSERT INTO `championship` VALUES(750, 1988, 5, 1037, 24); 762 | INSERT INTO `championship` VALUES(751, 1988, 6, 1000, 22); 763 | INSERT INTO `championship` VALUES(752, 1988, 7, 1022, 17); 764 | INSERT INTO `championship` VALUES(753, 1988, 8, 1019, 17); 765 | INSERT INTO `championship` VALUES(754, 1988, 9, 1054, 12); 766 | INSERT INTO `championship` VALUES(755, 1988, 10, 992, 12); 767 | INSERT INTO `championship` VALUES(756, 1988, 11, 1020, 8); 768 | INSERT INTO `championship` VALUES(757, 1988, 12, 983, 6); 769 | INSERT INTO `championship` VALUES(758, 1988, 13, 1010, 5); 770 | INSERT INTO `championship` VALUES(759, 1988, 14, 981, 5); 771 | INSERT INTO `championship` VALUES(760, 1988, 15, 1039, 3); 772 | INSERT INTO `championship` VALUES(761, 1988, 16, 1001, 1); 773 | INSERT INTO `championship` VALUES(762, 1988, 16, 1052, 1); 774 | INSERT INTO `championship` VALUES(763, 1989, 1, 1018, 76); 775 | INSERT INTO `championship` VALUES(764, 1989, 2, 1031, 60); 776 | INSERT INTO `championship` VALUES(765, 1989, 3, 1020, 40); 777 | INSERT INTO `championship` VALUES(766, 1989, 4, 1054, 38); 778 | INSERT INTO `championship` VALUES(767, 1989, 5, 1024, 37); 779 | INSERT INTO `championship` VALUES(768, 1989, 6, 992, 32); 780 | INSERT INTO `championship` VALUES(769, 1989, 7, 1063, 21); 781 | INSERT INTO `championship` VALUES(770, 1989, 8, 1000, 12); 782 | INSERT INTO `championship` VALUES(771, 1989, 9, 1080, 8); 783 | INSERT INTO `championship` VALUES(772, 1989, 10, 1019, 7); 784 | INSERT INTO `championship` VALUES(773, 1989, 11, 1004, 6); 785 | INSERT INTO `championship` VALUES(774, 1989, 11, 1037, 6); 786 | INSERT INTO `championship` VALUES(775, 1989, 11, 983, 6); 787 | INSERT INTO `championship` VALUES(776, 1989, 14, 1077, 5); 788 | INSERT INTO `championship` VALUES(777, 1989, 15, 1052, 5); 789 | INSERT INTO `championship` VALUES(778, 1989, 16, 1014, 4); 790 | INSERT INTO `championship` VALUES(779, 1989, 16, 1010, 4); 791 | INSERT INTO `championship` VALUES(780, 1989, 16, 1039, 4); 792 | INSERT INTO `championship` VALUES(781, 1989, 19, 1002, 4); 793 | INSERT INTO `championship` VALUES(782, 1989, 20, 1059, 4); 794 | INSERT INTO `championship` VALUES(783, 1989, 21, 1001, 3); 795 | INSERT INTO `championship` VALUES(784, 1989, 21, 982, 3); 796 | INSERT INTO `championship` VALUES(785, 1989, 23, 986, 2); 797 | INSERT INTO `championship` VALUES(786, 1989, 24, 1006, 2); 798 | INSERT INTO `championship` VALUES(787, 1989, 25, 981, 2); 799 | INSERT INTO `championship` VALUES(788, 1989, 26, 1041, 1); 800 | INSERT INTO `championship` VALUES(789, 1989, 26, 1015, 1); 801 | INSERT INTO `championship` VALUES(790, 1989, 26, 984, 1); 802 | INSERT INTO `championship` VALUES(791, 1989, 26, 1058, 1); 803 | INSERT INTO `championship` VALUES(792, 1990, 1, 1031, 78); 804 | INSERT INTO `championship` VALUES(793, 1990, 2, 1018, 71); 805 | INSERT INTO `championship` VALUES(794, 1990, 3, 1000, 43); 806 | INSERT INTO `championship` VALUES(795, 1990, 4, 1063, 43); 807 | INSERT INTO `championship` VALUES(796, 1990, 5, 1054, 37); 808 | INSERT INTO `championship` VALUES(797, 1990, 6, 1024, 34); 809 | INSERT INTO `championship` VALUES(798, 1990, 7, 1020, 23); 810 | INSERT INTO `championship` VALUES(799, 1990, 8, 992, 21); 811 | INSERT INTO `championship` VALUES(800, 1990, 9, 1080, 13); 812 | INSERT INTO `championship` VALUES(801, 1990, 10, 1048, 6); 813 | INSERT INTO `championship` VALUES(802, 1990, 10, 1022, 6); 814 | INSERT INTO `championship` VALUES(803, 1990, 12, 1047, 6); 815 | INSERT INTO `championship` VALUES(804, 1990, 13, 1033, 5); 816 | INSERT INTO `championship` VALUES(805, 1990, 14, 1019, 3); 817 | INSERT INTO `championship` VALUES(806, 1990, 15, 1001, 3); 818 | INSERT INTO `championship` VALUES(807, 1990, 16, 1014, 2); 819 | INSERT INTO `championship` VALUES(808, 1990, 16, 1002, 2); 820 | INSERT INTO `championship` VALUES(809, 1990, 18, 1010, 1); 821 | INSERT INTO `championship` VALUES(810, 1991, 1, 1031, 96); 822 | INSERT INTO `championship` VALUES(811, 1991, 2, 1054, 72); 823 | INSERT INTO `championship` VALUES(812, 1991, 3, 1020, 53); 824 | INSERT INTO `championship` VALUES(813, 1991, 4, 1063, 43); 825 | INSERT INTO `championship` VALUES(814, 1991, 5, 1018, 34); 826 | INSERT INTO `championship` VALUES(815, 1991, 6, 1000, 26.5); 827 | INSERT INTO `championship` VALUES(816, 1991, 7, 1080, 21); 828 | INSERT INTO `championship` VALUES(817, 1991, 8, 1014, 10); 829 | INSERT INTO `championship` VALUES(818, 1991, 9, 1039, 9); 830 | INSERT INTO `championship` VALUES(819, 1991, 10, 1048, 8); 831 | INSERT INTO `championship` VALUES(820, 1991, 11, 1052, 6); 832 | INSERT INTO `championship` VALUES(821, 1991, 12, 1038, 4); 833 | INSERT INTO `championship` VALUES(822, 1991, 13, 1105, 4); 834 | INSERT INTO `championship` VALUES(823, 1991, 13, 1051, 4); 835 | INSERT INTO `championship` VALUES(824, 1991, 15, 1001, 2); 836 | INSERT INTO `championship` VALUES(825, 1991, 16, 1081, 2); 837 | INSERT INTO `championship` VALUES(826, 1991, 17, 1059, 2); 838 | INSERT INTO `championship` VALUES(827, 1991, 18, 1033, 1); 839 | INSERT INTO `championship` VALUES(828, 1991, 19, 1046, 1); 840 | INSERT INTO `championship` VALUES(829, 1991, 19, 1003, 1); 841 | INSERT INTO `championship` VALUES(830, 1991, 19, 1022, 1); 842 | INSERT INTO `championship` VALUES(831, 1991, 19, 1006, 1); 843 | INSERT INTO `championship` VALUES(832, 1991, 19, 1047, 1); 844 | INSERT INTO `championship` VALUES(833, 1991, 24, 1067, 0.5); 845 | INSERT INTO `championship` VALUES(834, 1992, 1, 1054, 108); 846 | INSERT INTO `championship` VALUES(835, 1992, 2, 1020, 56); 847 | INSERT INTO `championship` VALUES(836, 1992, 3, 1105, 53); 848 | INSERT INTO `championship` VALUES(837, 1992, 4, 1031, 50); 849 | INSERT INTO `championship` VALUES(838, 1992, 5, 1063, 49); 850 | INSERT INTO `championship` VALUES(839, 1992, 6, 1059, 38); 851 | INSERT INTO `championship` VALUES(840, 1992, 7, 1080, 18); 852 | INSERT INTO `championship` VALUES(841, 1992, 8, 1081, 11); 853 | INSERT INTO `championship` VALUES(842, 1992, 9, 1039, 8); 854 | INSERT INTO `championship` VALUES(843, 1992, 10, 1037, 6); 855 | INSERT INTO `championship` VALUES(844, 1992, 11, 1029, 4); 856 | INSERT INTO `championship` VALUES(845, 1992, 12, 1053, 3); 857 | INSERT INTO `championship` VALUES(846, 1992, 13, 1022, 3); 858 | INSERT INTO `championship` VALUES(847, 1992, 14, 1024, 2); 859 | INSERT INTO `championship` VALUES(848, 1992, 15, 1052, 2); 860 | INSERT INTO `championship` VALUES(849, 1992, 15, 1077, 2); 861 | INSERT INTO `championship` VALUES(850, 1992, 17, 1014, 1); 862 | INSERT INTO `championship` VALUES(851, 1992, 17, 1036, 1); 863 | INSERT INTO `championship` VALUES(852, 1992, 17, 1051, 1); 864 | INSERT INTO `championship` VALUES(853, 1993, 1, 1018, 99); 865 | INSERT INTO `championship` VALUES(854, 1993, 2, 1031, 73); 866 | INSERT INTO `championship` VALUES(855, 1993, 3, 1075, 69); 867 | INSERT INTO `championship` VALUES(856, 1993, 4, 1105, 52); 868 | INSERT INTO `championship` VALUES(857, 1993, 5, 1020, 20); 869 | INSERT INTO `championship` VALUES(858, 1993, 6, 1080, 16); 870 | INSERT INTO `championship` VALUES(859, 1993, 7, 1059, 13); 871 | INSERT INTO `championship` VALUES(860, 1993, 8, 1063, 12); 872 | INSERT INTO `championship` VALUES(861, 1993, 9, 1077, 11); 873 | INSERT INTO `championship` VALUES(862, 1993, 10, 1046, 10); 874 | INSERT INTO `championship` VALUES(863, 1993, 11, 1021, 7); 875 | INSERT INTO `championship` VALUES(864, 1993, 12, 1053, 7); 876 | INSERT INTO `championship` VALUES(865, 1993, 13, 1038, 5); 877 | INSERT INTO `championship` VALUES(866, 1993, 13, 1036, 5); 878 | INSERT INTO `championship` VALUES(867, 1993, 15, 1081, 4); 879 | INSERT INTO `championship` VALUES(868, 1993, 16, 1019, 4); 880 | INSERT INTO `championship` VALUES(869, 1993, 17, 1124, 2); 881 | INSERT INTO `championship` VALUES(870, 1993, 17, 1041, 2); 882 | INSERT INTO `championship` VALUES(871, 1993, 19, 1023, 2); 883 | INSERT INTO `championship` VALUES(872, 1993, 20, 1029, 1); 884 | INSERT INTO `championship` VALUES(873, 1993, 21, 1085, 1); 885 | INSERT INTO `championship` VALUES(874, 1993, 21, 1074, 1); 886 | INSERT INTO `championship` VALUES(875, 1994, 1, 1105, 92); 887 | INSERT INTO `championship` VALUES(876, 1994, 2, 1075, 91); 888 | INSERT INTO `championship` VALUES(877, 1994, 3, 1063, 41); 889 | INSERT INTO `championship` VALUES(878, 1994, 4, 1081, 26); 890 | INSERT INTO `championship` VALUES(879, 1994, 5, 1080, 24); 891 | INSERT INTO `championship` VALUES(880, 1994, 6, 1124, 19); 892 | INSERT INTO `championship` VALUES(881, 1994, 7, 1059, 16); 893 | INSERT INTO `championship` VALUES(882, 1994, 8, 1120, 14); 894 | INSERT INTO `championship` VALUES(883, 1994, 9, 1054, 13); 895 | INSERT INTO `championship` VALUES(884, 1994, 10, 1091, 10); 896 | INSERT INTO `championship` VALUES(885, 1994, 11, 1096, 9); 897 | INSERT INTO `championship` VALUES(886, 1994, 12, 1046, 8); 898 | INSERT INTO `championship` VALUES(887, 1994, 13, 1090, 7); 899 | INSERT INTO `championship` VALUES(888, 1994, 14, 1064, 6); 900 | INSERT INTO `championship` VALUES(889, 1994, 15, 1036, 6); 901 | INSERT INTO `championship` VALUES(890, 1994, 16, 1085, 6); 902 | INSERT INTO `championship` VALUES(891, 1994, 17, 1066, 5); 903 | INSERT INTO `championship` VALUES(892, 1994, 18, 1033, 4); 904 | INSERT INTO `championship` VALUES(893, 1994, 19, 1053, 4); 905 | INSERT INTO `championship` VALUES(894, 1994, 19, 1039, 4); 906 | INSERT INTO `championship` VALUES(895, 1994, 21, 1052, 4); 907 | INSERT INTO `championship` VALUES(896, 1994, 22, 1067, 3); 908 | INSERT INTO `championship` VALUES(897, 1994, 23, 1029, 2); 909 | INSERT INTO `championship` VALUES(898, 1994, 24, 1037, 1); 910 | INSERT INTO `championship` VALUES(899, 1994, 24, 1038, 1); 911 | INSERT INTO `championship` VALUES(900, 1995, 1, 1105, 102); 912 | INSERT INTO `championship` VALUES(901, 1995, 2, 1075, 69); 913 | INSERT INTO `championship` VALUES(902, 1995, 3, 1120, 49); 914 | INSERT INTO `championship` VALUES(903, 1995, 4, 1077, 45); 915 | INSERT INTO `championship` VALUES(904, 1995, 5, 1080, 42); 916 | INSERT INTO `championship` VALUES(905, 1995, 6, 1063, 31); 917 | INSERT INTO `championship` VALUES(906, 1995, 7, 1081, 17); 918 | INSERT INTO `championship` VALUES(907, 1995, 8, 1096, 16); 919 | INSERT INTO `championship` VALUES(908, 1995, 9, 1090, 15); 920 | INSERT INTO `championship` VALUES(909, 1995, 10, 1046, 13); 921 | INSERT INTO `championship` VALUES(910, 1995, 11, 1124, 11); 922 | INSERT INTO `championship` VALUES(911, 1995, 12, 1085, 10); 923 | INSERT INTO `championship` VALUES(912, 1995, 13, 1059, 7); 924 | INSERT INTO `championship` VALUES(913, 1995, 14, 1067, 5); 925 | INSERT INTO `championship` VALUES(914, 1995, 15, 1086, 5); 926 | INSERT INTO `championship` VALUES(915, 1995, 16, 1055, 3); 927 | INSERT INTO `championship` VALUES(916, 1995, 17, 1061, 1); 928 | INSERT INTO `championship` VALUES(917, 1995, 17, 1047, 1); 929 | INSERT INTO `championship` VALUES(918, 1996, 1, 1075, 97); 930 | INSERT INTO `championship` VALUES(919, 1996, 2, 1109, 78); 931 | INSERT INTO `championship` VALUES(920, 1996, 3, 1105, 59); 932 | INSERT INTO `championship` VALUES(921, 1996, 4, 1080, 47); 933 | INSERT INTO `championship` VALUES(922, 1996, 5, 1081, 31); 934 | INSERT INTO `championship` VALUES(923, 1996, 6, 1063, 21); 935 | INSERT INTO `championship` VALUES(924, 1996, 7, 1120, 18); 936 | INSERT INTO `championship` VALUES(925, 1996, 8, 1124, 14); 937 | INSERT INTO `championship` VALUES(926, 1996, 9, 1096, 13); 938 | INSERT INTO `championship` VALUES(927, 1996, 10, 1085, 11); 939 | INSERT INTO `championship` VALUES(928, 1996, 11, 1059, 8); 940 | INSERT INTO `championship` VALUES(929, 1996, 12, 1090, 7); 941 | INSERT INTO `championship` VALUES(930, 1996, 13, 1086, 5); 942 | INSERT INTO `championship` VALUES(931, 1996, 14, 1077, 4); 943 | INSERT INTO `championship` VALUES(932, 1996, 15, 1078, 2); 944 | INSERT INTO `championship` VALUES(933, 1996, 16, 1091, 1); 945 | INSERT INTO `championship` VALUES(934, 1997, 1, 1109, 81); 946 | INSERT INTO `championship` VALUES(935, 1997, 0, 1105, 78); 947 | INSERT INTO `championship` VALUES(936, 1997, 2, 1090, 42); 948 | INSERT INTO `championship` VALUES(937, 1997, 3, 1120, 36); 949 | INSERT INTO `championship` VALUES(938, 1997, 4, 1080, 36); 950 | INSERT INTO `championship` VALUES(939, 1997, 5, 1063, 27); 951 | INSERT INTO `championship` VALUES(940, 1997, 6, 1081, 27); 952 | INSERT INTO `championship` VALUES(941, 1997, 7, 1085, 24); 953 | INSERT INTO `championship` VALUES(942, 1997, 8, 1133, 20); 954 | INSERT INTO `championship` VALUES(943, 1997, 9, 1096, 16); 955 | INSERT INTO `championship` VALUES(944, 1997, 10, 1077, 15); 956 | INSERT INTO `championship` VALUES(945, 1997, 11, 1114, 13); 957 | INSERT INTO `championship` VALUES(946, 1997, 12, 1075, 7); 958 | INSERT INTO `championship` VALUES(947, 1997, 13, 1124, 6); 959 | INSERT INTO `championship` VALUES(948, 1997, 14, 1115, 4); 960 | INSERT INTO `championship` VALUES(949, 1997, 15, 1125, 3); 961 | INSERT INTO `championship` VALUES(950, 1997, 16, 1078, 2); 962 | INSERT INTO `championship` VALUES(951, 1997, 16, 1086, 2); 963 | INSERT INTO `championship` VALUES(952, 1997, 18, 1071, 2); 964 | INSERT INTO `championship` VALUES(953, 1997, 19, 1064, 1); 965 | INSERT INTO `championship` VALUES(954, 1998, 1, 1081, 100); 966 | INSERT INTO `championship` VALUES(955, 1998, 2, 1105, 86); 967 | INSERT INTO `championship` VALUES(956, 1998, 3, 1120, 56); 968 | INSERT INTO `championship` VALUES(957, 1998, 4, 1085, 47); 969 | INSERT INTO `championship` VALUES(958, 1998, 5, 1109, 21); 970 | INSERT INTO `championship` VALUES(959, 1998, 6, 1075, 20); 971 | INSERT INTO `championship` VALUES(960, 1998, 7, 1090, 17); 972 | INSERT INTO `championship` VALUES(961, 1998, 8, 1115, 17); 973 | INSERT INTO `championship` VALUES(962, 1998, 9, 1133, 16); 974 | INSERT INTO `championship` VALUES(963, 1998, 10, 1114, 14); 975 | INSERT INTO `championship` VALUES(964, 1998, 11, 1080, 9); 976 | INSERT INTO `championship` VALUES(965, 1998, 12, 1124, 4); 977 | INSERT INTO `championship` VALUES(966, 1998, 13, 1086, 3); 978 | INSERT INTO `championship` VALUES(967, 1998, 14, 1078, 3); 979 | INSERT INTO `championship` VALUES(968, 1998, 15, 1077, 1); 980 | INSERT INTO `championship` VALUES(969, 1998, 15, 1125, 1); 981 | INSERT INTO `championship` VALUES(970, 1998, 15, 1069, 1); 982 | INSERT INTO `championship` VALUES(971, 1999, 1, 1081, 76); 983 | INSERT INTO `championship` VALUES(972, 1999, 2, 1085, 74); 984 | INSERT INTO `championship` VALUES(973, 1999, 3, 1090, 54); 985 | INSERT INTO `championship` VALUES(974, 1999, 4, 1120, 48); 986 | INSERT INTO `championship` VALUES(975, 1999, 5, 1105, 44); 987 | INSERT INTO `championship` VALUES(976, 1999, 6, 1114, 35); 988 | INSERT INTO `championship` VALUES(977, 1999, 7, 1124, 21); 989 | INSERT INTO `championship` VALUES(978, 1999, 8, 1077, 15); 990 | INSERT INTO `championship` VALUES(979, 1999, 9, 1133, 13); 991 | INSERT INTO `championship` VALUES(980, 1999, 10, 1086, 10); 992 | INSERT INTO `championship` VALUES(981, 1999, 11, 1125, 7); 993 | INSERT INTO `championship` VALUES(982, 1999, 12, 1075, 7); 994 | INSERT INTO `championship` VALUES(983, 1999, 13, 1115, 3); 995 | INSERT INTO `championship` VALUES(984, 1999, 14, 1078, 3); 996 | INSERT INTO `championship` VALUES(985, 1999, 15, 1096, 2); 997 | INSERT INTO `championship` VALUES(986, 1999, 15, 1080, 2); 998 | INSERT INTO `championship` VALUES(987, 1999, 17, 1112, 1); 999 | INSERT INTO `championship` VALUES(988, 1999, 18, 1100, 1); 1000 | INSERT INTO `championship` VALUES(989, 2000, 1, 1105, 108); 1001 | INSERT INTO `championship` VALUES(990, 2000, 2, 1081, 89); 1002 | INSERT INTO `championship` VALUES(991, 2000, 3, 1120, 73); 1003 | INSERT INTO `championship` VALUES(992, 2000, 4, 1124, 62); 1004 | INSERT INTO `championship` VALUES(993, 2000, 5, 1114, 24); 1005 | INSERT INTO `championship` VALUES(994, 2000, 6, 1133, 18); 1006 | INSERT INTO `championship` VALUES(995, 2000, 7, 1109, 17); 1007 | INSERT INTO `championship` VALUES(996, 2000, 8, 1123, 12); 1008 | INSERT INTO `championship` VALUES(997, 2000, 9, 1090, 11); 1009 | INSERT INTO `championship` VALUES(998, 2000, 10, 1125, 6); 1010 | INSERT INTO `championship` VALUES(999, 2000, 11, 1086, 6); 1011 | INSERT INTO `championship` VALUES(1000, 2000, 12, 1091, 5); 1012 | INSERT INTO `championship` VALUES(1001, 2000, 13, 1085, 4); 1013 | INSERT INTO `championship` VALUES(1002, 2000, 14, 1103, 3); 1014 | INSERT INTO `championship` VALUES(1003, 2000, 15, 1115, 2); 1015 | INSERT INTO `championship` VALUES(1004, 2000, 16, 1112, 2); 1016 | INSERT INTO `championship` VALUES(1005, 2001, 1, 1105, 123); 1017 | INSERT INTO `championship` VALUES(1006, 2001, 2, 1120, 65); 1018 | INSERT INTO `championship` VALUES(1007, 2001, 3, 1124, 56); 1019 | INSERT INTO `championship` VALUES(1008, 2001, 4, 1114, 49); 1020 | INSERT INTO `championship` VALUES(1009, 2001, 5, 1081, 37); 1021 | INSERT INTO `championship` VALUES(1010, 2001, 6, 1106, 31); 1022 | INSERT INTO `championship` VALUES(1011, 2001, 7, 1109, 12); 1023 | INSERT INTO `championship` VALUES(1012, 2001, 8, 1132, 12); 1024 | INSERT INTO `championship` VALUES(1013, 2001, 9, 1125, 12); 1025 | INSERT INTO `championship` VALUES(1014, 2001, 10, 1141, 9); 1026 | INSERT INTO `championship` VALUES(1015, 2001, 11, 1133, 8); 1027 | INSERT INTO `championship` VALUES(1016, 2001, 12, 1085, 6); 1028 | INSERT INTO `championship` VALUES(1017, 2001, 13, 1090, 6); 1029 | INSERT INTO `championship` VALUES(1018, 2001, 14, 1096, 5); 1030 | INSERT INTO `championship` VALUES(1019, 2001, 15, 1080, 5); 1031 | INSERT INTO `championship` VALUES(1020, 2001, 16, 1112, 3); 1032 | INSERT INTO `championship` VALUES(1021, 2001, 17, 1123, 2); 1033 | INSERT INTO `championship` VALUES(1022, 2001, 18, 1091, 1); 1034 | INSERT INTO `championship` VALUES(1023, 2002, 1, 1105, 144); 1035 | INSERT INTO `championship` VALUES(1024, 2002, 2, 1124, 77); 1036 | INSERT INTO `championship` VALUES(1025, 2002, 3, 1106, 50); 1037 | INSERT INTO `championship` VALUES(1026, 2002, 4, 1114, 42); 1038 | INSERT INTO `championship` VALUES(1027, 2002, 5, 1120, 41); 1039 | INSERT INTO `championship` VALUES(1028, 2002, 6, 1141, 24); 1040 | INSERT INTO `championship` VALUES(1029, 2002, 7, 1123, 14); 1041 | INSERT INTO `championship` VALUES(1030, 2002, 8, 1125, 9); 1042 | INSERT INTO `championship` VALUES(1031, 2002, 9, 1085, 8); 1043 | INSERT INTO `championship` VALUES(1032, 2002, 10, 1132, 7); 1044 | INSERT INTO `championship` VALUES(1033, 2002, 11, 1133, 7); 1045 | INSERT INTO `championship` VALUES(1034, 2002, 12, 1109, 4); 1046 | INSERT INTO `championship` VALUES(1035, 2002, 13, 1142, 4); 1047 | INSERT INTO `championship` VALUES(1036, 2002, 14, 1096, 3); 1048 | INSERT INTO `championship` VALUES(1037, 2002, 15, 1122, 2); 1049 | INSERT INTO `championship` VALUES(1038, 2002, 15, 1134, 2); 1050 | INSERT INTO `championship` VALUES(1039, 2002, 17, 1086, 2); 1051 | INSERT INTO `championship` VALUES(1040, 2002, 17, 1090, 2); 1052 | INSERT INTO `championship` VALUES(1041, 2003, 1, 1105, 93); 1053 | INSERT INTO `championship` VALUES(1042, 2003, 2, 1141, 91); 1054 | INSERT INTO `championship` VALUES(1043, 2003, 3, 1106, 82); 1055 | INSERT INTO `championship` VALUES(1044, 2003, 4, 1124, 65); 1056 | INSERT INTO `championship` VALUES(1045, 2003, 5, 1114, 58); 1057 | INSERT INTO `championship` VALUES(1046, 2003, 6, 1127, 55); 1058 | INSERT INTO `championship` VALUES(1047, 2003, 7, 1120, 51); 1059 | INSERT INTO `championship` VALUES(1048, 2003, 8, 1125, 33); 1060 | INSERT INTO `championship` VALUES(1049, 2003, 9, 1123, 17); 1061 | INSERT INTO `championship` VALUES(1050, 2003, 10, 1134, 17); 1062 | INSERT INTO `championship` VALUES(1051, 2003, 11, 1090, 13); 1063 | INSERT INTO `championship` VALUES(1052, 2003, 12, 1133, 12); 1064 | INSERT INTO `championship` VALUES(1053, 2003, 13, 1095, 10); 1065 | INSERT INTO `championship` VALUES(1054, 2003, 14, 1096, 6); 1066 | INSERT INTO `championship` VALUES(1055, 2003, 14, 1132, 6); 1067 | INSERT INTO `championship` VALUES(1056, 2003, 16, 1109, 6); 1068 | INSERT INTO `championship` VALUES(1057, 2003, 17, 1100, 4); 1069 | INSERT INTO `championship` VALUES(1058, 2003, 18, 1122, 3); 1070 | INSERT INTO `championship` VALUES(1059, 2003, 19, 1092, 1); 1071 | INSERT INTO `championship` VALUES(1060, 2003, 19, 1093, 1); 1072 | INSERT INTO `championship` VALUES(1061, 2004, 1, 1105, 148); 1073 | INSERT INTO `championship` VALUES(1062, 2004, 2, 1124, 114); 1074 | INSERT INTO `championship` VALUES(1063, 2004, 3, 1123, 85); 1075 | INSERT INTO `championship` VALUES(1064, 2004, 4, 1127, 59); 1076 | INSERT INTO `championship` VALUES(1065, 2004, 5, 1106, 58); 1077 | INSERT INTO `championship` VALUES(1066, 2004, 6, 1125, 46); 1078 | INSERT INTO `championship` VALUES(1067, 2004, 7, 1141, 45); 1079 | INSERT INTO `championship` VALUES(1068, 2004, 8, 1122, 34); 1080 | INSERT INTO `championship` VALUES(1069, 2004, 9, 1114, 24); 1081 | INSERT INTO `championship` VALUES(1070, 2004, 10, 1120, 24); 1082 | INSERT INTO `championship` VALUES(1071, 2004, 11, 1133, 22); 1083 | INSERT INTO `championship` VALUES(1072, 2004, 12, 1142, 12); 1084 | INSERT INTO `championship` VALUES(1073, 2004, 13, 1134, 7); 1085 | INSERT INTO `championship` VALUES(1074, 2004, 14, 1096, 6); 1086 | INSERT INTO `championship` VALUES(1075, 2004, 15, 1104, 6); 1087 | INSERT INTO `championship` VALUES(1076, 2004, 16, 1095, 3); 1088 | INSERT INTO `championship` VALUES(1077, 2004, 16, 1107, 3); 1089 | INSERT INTO `championship` VALUES(1078, 2004, 18, 1132, 3); 1090 | INSERT INTO `championship` VALUES(1079, 2004, 19, 1126, 2); 1091 | INSERT INTO `championship` VALUES(1080, 2004, 20, 1099, 1); 1092 | INSERT INTO `championship` VALUES(1081, 2005, 1, 1127, 133); 1093 | INSERT INTO `championship` VALUES(1082, 2005, 2, 1141, 112); 1094 | INSERT INTO `championship` VALUES(1083, 2005, 3, 1105, 62); 1095 | INSERT INTO `championship` VALUES(1084, 2005, 4, 1106, 60); 1096 | INSERT INTO `championship` VALUES(1085, 2005, 5, 1133, 58); 1097 | INSERT INTO `championship` VALUES(1086, 2005, 6, 1114, 45); 1098 | INSERT INTO `championship` VALUES(1087, 2005, 7, 1125, 43); 1099 | INSERT INTO `championship` VALUES(1088, 2005, 8, 1124, 38); 1100 | INSERT INTO `championship` VALUES(1089, 2005, 9, 1123, 37); 1101 | INSERT INTO `championship` VALUES(1090, 2005, 10, 1134, 36); 1102 | INSERT INTO `championship` VALUES(1091, 2005, 11, 1132, 28); 1103 | INSERT INTO `championship` VALUES(1092, 2005, 12, 1120, 24); 1104 | INSERT INTO `championship` VALUES(1093, 2005, 13, 1142, 11); 1105 | INSERT INTO `championship` VALUES(1094, 2005, 14, 1109, 9); 1106 | INSERT INTO `championship` VALUES(1095, 2005, 15, 1107, 9); 1107 | INSERT INTO `championship` VALUES(1096, 2005, 16, 1108, 7); 1108 | INSERT INTO `championship` VALUES(1097, 2005, 17, 1115, 6); 1109 | INSERT INTO `championship` VALUES(1098, 2005, 18, 1101, 5); 1110 | INSERT INTO `championship` VALUES(1099, 2005, 19, 1112, 4); 1111 | INSERT INTO `championship` VALUES(1100, 2005, 19, 1116, 4); 1112 | INSERT INTO `championship` VALUES(1101, 2005, 21, 1102, 3); 1113 | INSERT INTO `championship` VALUES(1102, 2005, 22, 1104, 2); 1114 | INSERT INTO `championship` VALUES(1103, 2005, 23, 1146, 1); 1115 | INSERT INTO `championship` VALUES(1104, 2005, 23, 1122, 1); 1116 | INSERT INTO `championship` VALUES(1105, 2006, 1, 1127, 134); 1117 | INSERT INTO `championship` VALUES(1106, 2006, 2, 1105, 121); 1118 | INSERT INTO `championship` VALUES(1107, 2006, 3, 1142, 80); 1119 | INSERT INTO `championship` VALUES(1108, 2006, 4, 1133, 72); 1120 | INSERT INTO `championship` VALUES(1109, 2006, 5, 1141, 65); 1121 | INSERT INTO `championship` VALUES(1110, 2006, 6, 1123, 56); 1122 | INSERT INTO `championship` VALUES(1111, 2006, 7, 1124, 30); 1123 | INSERT INTO `championship` VALUES(1112, 2006, 8, 1106, 26); 1124 | INSERT INTO `championship` VALUES(1113, 2006, 9, 1132, 23); 1125 | INSERT INTO `championship` VALUES(1114, 2006, 10, 1114, 20); 1126 | INSERT INTO `championship` VALUES(1115, 2006, 11, 1112, 19); 1127 | INSERT INTO `championship` VALUES(1116, 2006, 12, 1125, 15); 1128 | INSERT INTO `championship` VALUES(1117, 2006, 13, 1120, 14); 1129 | INSERT INTO `championship` VALUES(1118, 2006, 14, 1134, 7); 1130 | INSERT INTO `championship` VALUES(1119, 2006, 15, 1109, 7); 1131 | INSERT INTO `championship` VALUES(1120, 2006, 16, 1136, 6); 1132 | INSERT INTO `championship` VALUES(1121, 2006, 17, 1128, 4); 1133 | INSERT INTO `championship` VALUES(1122, 2006, 18, 1107, 2); 1134 | INSERT INTO `championship` VALUES(1123, 2006, 19, 1146, 1); 1135 | INSERT INTO `championship` VALUES(1124, 2007, 1, 1141, 110); 1136 | INSERT INTO `championship` VALUES(1125, 2007, 2, 1140, 109); 1137 | INSERT INTO `championship` VALUES(1126, 2007, 3, 1127, 109); 1138 | INSERT INTO `championship` VALUES(1127, 2007, 4, 1142, 94); 1139 | INSERT INTO `championship` VALUES(1128, 2007, 5, 1132, 61); 1140 | INSERT INTO `championship` VALUES(1129, 2007, 6, 1136, 39); 1141 | INSERT INTO `championship` VALUES(1130, 2007, 7, 1137, 30); 1142 | INSERT INTO `championship` VALUES(1131, 2007, 8, 1133, 21); 1143 | INSERT INTO `championship` VALUES(1132, 2007, 9, 1128, 20); 1144 | INSERT INTO `championship` VALUES(1133, 2007, 10, 1120, 14); 1145 | INSERT INTO `championship` VALUES(1134, 2007, 11, 1115, 13); 1146 | INSERT INTO `championship` VALUES(1135, 2007, 12, 1134, 10); 1147 | INSERT INTO `championship` VALUES(1136, 2007, 13, 1125, 8); 1148 | INSERT INTO `championship` VALUES(1137, 2007, 14, 1135, 6); 1149 | INSERT INTO `championship` VALUES(1138, 2007, 15, 1123, 6); 1150 | INSERT INTO `championship` VALUES(1139, 2007, 16, 1114, 5); 1151 | INSERT INTO `championship` VALUES(1140, 2007, 17, 1122, 4); 1152 | INSERT INTO `championship` VALUES(1141, 2007, 18, 1146, 3); 1153 | INSERT INTO `championship` VALUES(1142, 2007, 19, 1131, 1); 1154 | INSERT INTO `championship` VALUES(1143, 2008, 1, 1140, 98); 1155 | INSERT INTO `championship` VALUES(1144, 2008, 2, 1142, 97); 1156 | INSERT INTO `championship` VALUES(1145, 2008, 3, 1141, 75); 1157 | INSERT INTO `championship` VALUES(1146, 2008, 4, 1136, 75); 1158 | INSERT INTO `championship` VALUES(1147, 2008, 5, 1127, 61); 1159 | INSERT INTO `championship` VALUES(1148, 2008, 6, 1132, 60); 1160 | INSERT INTO `championship` VALUES(1149, 2008, 7, 1137, 53); 1161 | INSERT INTO `championship` VALUES(1150, 2008, 8, 1135, 35); 1162 | INSERT INTO `championship` VALUES(1151, 2008, 9, 1125, 31); 1163 | INSERT INTO `championship` VALUES(1152, 2008, 10, 1126, 25); 1164 | INSERT INTO `championship` VALUES(1153, 2008, 11, 1134, 21); 1165 | INSERT INTO `championship` VALUES(1154, 2008, 12, 1138, 19); 1166 | INSERT INTO `championship` VALUES(1155, 2008, 13, 1128, 17); 1167 | INSERT INTO `championship` VALUES(1156, 2008, 14, 1124, 11); 1168 | INSERT INTO `championship` VALUES(1157, 2008, 15, 1139, 9); 1169 | INSERT INTO `championship` VALUES(1158, 2008, 16, 1120, 8); 1170 | INSERT INTO `championship` VALUES(1159, 2008, 17, 1130, 4); 1171 | INSERT INTO `championship` VALUES(1160, 2008, 18, 1123, 3); 1172 | INSERT INTO `championship` VALUES(1161, 2009, 1, 1123, 95); 1173 | INSERT INTO `championship` VALUES(1162, 2009, 2, 1135, 84); 1174 | INSERT INTO `championship` VALUES(1163, 2009, 3, 1124, 77); 1175 | INSERT INTO `championship` VALUES(1164, 2009, 4, 1134, 69.5); 1176 | INSERT INTO `championship` VALUES(1165, 2009, 5, 1140, 49); 1177 | INSERT INTO `championship` VALUES(1166, 2009, 6, 1141, 48); 1178 | INSERT INTO `championship` VALUES(1167, 2009, 7, 1128, 34.5); 1179 | INSERT INTO `championship` VALUES(1168, 2009, 8, 1125, 32.5); 1180 | INSERT INTO `championship` VALUES(1169, 2009, 9, 1127, 26); 1181 | INSERT INTO `championship` VALUES(1170, 2009, 10, 1126, 24); 1182 | INSERT INTO `championship` VALUES(1171, 2009, 11, 1142, 22); 1183 | INSERT INTO `championship` VALUES(1172, 2009, 12, 1137, 22); 1184 | INSERT INTO `championship` VALUES(1173, 2009, 13, 1132, 19); 1185 | INSERT INTO `championship` VALUES(1174, 2009, 14, 1136, 17); 1186 | INSERT INTO `championship` VALUES(1175, 2009, 15, 1133, 8); 1187 | INSERT INTO `championship` VALUES(1176, 2009, 16, 1129, 6); 1188 | INSERT INTO `championship` VALUES(1177, 2009, 17, 1131, 5); 1189 | INSERT INTO `championship` VALUES(1178, 2009, 18, 1147, 3); 1190 | INSERT INTO `championship` VALUES(1179, 2009, 19, 1130, 2); 1191 | INSERT INTO `championship` VALUES(1180, 2010, 1, 1135, 256); 1192 | INSERT INTO `championship` VALUES(1181, 2010, 2, 1127, 252); 1193 | INSERT INTO `championship` VALUES(1182, 2010, 3, 1134, 242); 1194 | INSERT INTO `championship` VALUES(1183, 2010, 4, 1140, 240); 1195 | INSERT INTO `championship` VALUES(1184, 2010, 5, 1123, 214); 1196 | INSERT INTO `championship` VALUES(1185, 2010, 6, 1142, 144); 1197 | INSERT INTO `championship` VALUES(1186, 2010, 7, 1128, 142); 1198 | INSERT INTO `championship` VALUES(1187, 2010, 8, 1136, 136); 1199 | INSERT INTO `championship` VALUES(1188, 2010, 9, 1105, 72); 1200 | INSERT INTO `championship` VALUES(1189, 2010, 10, 1124, 47); 1201 | INSERT INTO `championship` VALUES(1190, 2010, 11, 1131, 47); 1202 | INSERT INTO `championship` VALUES(1191, 2010, 12, 1147, 32); 1203 | INSERT INTO `championship` VALUES(1192, 2010, 13, 1150, 27); 1204 | INSERT INTO `championship` VALUES(1193, 2010, 14, 1148, 22); 1205 | INSERT INTO `championship` VALUES(1194, 2010, 15, 1146, 21); 1206 | INSERT INTO `championship` VALUES(1195, 2010, 16, 1129, 8); 1207 | INSERT INTO `championship` VALUES(1196, 2010, 17, 1112, 6); 1208 | INSERT INTO `championship` VALUES(1197, 2010, 18, 1132, 6); 1209 | INSERT INTO `championship` VALUES(1198, 2010, 19, 1143, 5); 1210 | INSERT INTO `championship` VALUES(1199, 2011, 1, 1135, 392); 1211 | INSERT INTO `championship` VALUES(1200, 2011, 2, 1123, 270); 1212 | INSERT INTO `championship` VALUES(1201, 2011, 3, 1134, 258); 1213 | INSERT INTO `championship` VALUES(1202, 2011, 4, 1127, 257); 1214 | INSERT INTO `championship` VALUES(1203, 2011, 5, 1140, 227); 1215 | INSERT INTO `championship` VALUES(1204, 2011, 6, 1142, 118); 1216 | INSERT INTO `championship` VALUES(1205, 2011, 7, 1128, 89); 1217 | INSERT INTO `championship` VALUES(1206, 2011, 8, 1105, 76); 1218 | INSERT INTO `championship` VALUES(1207, 2011, 9, 1131, 42); 1219 | INSERT INTO `championship` VALUES(1208, 2011, 10, 1150, 37); 1220 | INSERT INTO `championship` VALUES(1209, 2011, 11, 1132, 34); 1221 | INSERT INTO `championship` VALUES(1210, 2011, 12, 1147, 30); 1222 | INSERT INTO `championship` VALUES(1211, 2011, 13, 1153, 27); 1223 | INSERT INTO `championship` VALUES(1212, 2011, 14, 1143, 26); 1224 | INSERT INTO `championship` VALUES(1213, 2011, 15, 1129, 15); 1225 | INSERT INTO `championship` VALUES(1214, 2011, 16, 1155, 14); 1226 | INSERT INTO `championship` VALUES(1215, 2011, 17, 1124, 4); 1227 | INSERT INTO `championship` VALUES(1216, 2011, 18, 1151, 2); 1228 | INSERT INTO `championship` VALUES(1217, 2011, 19, 1156, 1); 1229 | INSERT INTO `championship` VALUES(1218, 2012, 1, 1135, 281); 1230 | INSERT INTO `championship` VALUES(1219, 2012, 2, 1127, 278); 1231 | INSERT INTO `championship` VALUES(1220, 2012, 3, 1141, 207); 1232 | INSERT INTO `championship` VALUES(1221, 2012, 4, 1140, 190); 1233 | INSERT INTO `championship` VALUES(1222, 2012, 5, 1123, 188); 1234 | INSERT INTO `championship` VALUES(1223, 2012, 6, 1134, 179); 1235 | INSERT INTO `championship` VALUES(1224, 2012, 7, 1142, 122); 1236 | INSERT INTO `championship` VALUES(1225, 2012, 8, 1144, 96); 1237 | INSERT INTO `championship` VALUES(1226, 2012, 9, 1128, 93); 1238 | INSERT INTO `championship` VALUES(1227, 2012, 10, 1155, 66); 1239 | INSERT INTO `championship` VALUES(1228, 2012, 11, 1148, 63); 1240 | INSERT INTO `championship` VALUES(1229, 2012, 12, 1147, 60); 1241 | INSERT INTO `championship` VALUES(1230, 2012, 13, 1105, 49); 1242 | INSERT INTO `championship` VALUES(1231, 2012, 14, 1153, 46); 1243 | INSERT INTO `championship` VALUES(1232, 2012, 15, 1156, 45); 1244 | INSERT INTO `championship` VALUES(1233, 2012, 16, 1151, 31); 1245 | INSERT INTO `championship` VALUES(1234, 2012, 17, 1158, 16); 1246 | INSERT INTO `championship` VALUES(1235, 2012, 18, 1157, 10); 1247 | INSERT INTO `championship` VALUES(1236, 2013, 1, 1135, 397); 1248 | INSERT INTO `championship` VALUES(1237, 2013, 2, 1127, 242); 1249 | INSERT INTO `championship` VALUES(1238, 2013, 3, 1134, 199); 1250 | INSERT INTO `championship` VALUES(1239, 2013, 4, 1140, 189); 1251 | INSERT INTO `championship` VALUES(1240, 2013, 5, 1141, 183); 1252 | INSERT INTO `championship` VALUES(1241, 2013, 6, 1128, 171); 1253 | INSERT INTO `championship` VALUES(1242, 2013, 7, 1144, 132); 1254 | INSERT INTO `championship` VALUES(1243, 2013, 8, 1142, 112); 1255 | INSERT INTO `championship` VALUES(1244, 2013, 9, 1123, 73); 1256 | INSERT INTO `championship` VALUES(1245, 2013, 10, 1148, 51); 1257 | INSERT INTO `championship` VALUES(1246, 2013, 11, 1155, 49); 1258 | INSERT INTO `championship` VALUES(1247, 2013, 12, 1153, 48); 1259 | INSERT INTO `championship` VALUES(1248, 2013, 13, 1131, 29); 1260 | INSERT INTO `championship` VALUES(1249, 2013, 14, 1157, 20); 1261 | INSERT INTO `championship` VALUES(1250, 2013, 15, 1158, 13); 1262 | INSERT INTO `championship` VALUES(1251, 2013, 16, 1160, 6); 1263 | INSERT INTO `championship` VALUES(1252, 2013, 17, 1161, 4); 1264 | INSERT INTO `championship` VALUES(1253, 2013, 18, 1156, 1); 1265 | INSERT INTO `championship` VALUES(1254, 2014, 1, 1140, 384); 1266 | INSERT INTO `championship` VALUES(1255, 2014, 2, 1128, 317); 1267 | INSERT INTO `championship` VALUES(1256, 2014, 3, 1157, 238); 1268 | INSERT INTO `championship` VALUES(1257, 2014, 4, 1161, 186); 1269 | INSERT INTO `championship` VALUES(1258, 2014, 5, 1135, 167); 1270 | INSERT INTO `championship` VALUES(1259, 2014, 6, 1127, 161); 1271 | INSERT INTO `championship` VALUES(1260, 2014, 7, 1142, 134); 1272 | INSERT INTO `championship` VALUES(1261, 2014, 8, 1123, 126); 1273 | INSERT INTO `championship` VALUES(1262, 2014, 9, 1148, 96); 1274 | INSERT INTO `championship` VALUES(1263, 2014, 10, 1155, 59); 1275 | INSERT INTO `championship` VALUES(1264, 2014, 11, 1165, 55); 1276 | INSERT INTO `championship` VALUES(1265, 2014, 12, 1141, 55); 1277 | INSERT INTO `championship` VALUES(1266, 2014, 13, 1158, 22); 1278 | INSERT INTO `championship` VALUES(1267, 2014, 14, 1144, 8); 1279 | INSERT INTO `championship` VALUES(1268, 2014, 15, 1166, 8); 1280 | INSERT INTO `championship` VALUES(1269, 2014, 16, 1156, 2); 1281 | INSERT INTO `championship` VALUES(1270, 2014, 17, 1162, 2); 1282 | INSERT INTO `championship` VALUES(1271, 2015, 1, 1140, 381); 1283 | INSERT INTO `championship` VALUES(1272, 2015, 2, 1128, 322); 1284 | INSERT INTO `championship` VALUES(1273, 2015, 3, 1135, 278); 1285 | INSERT INTO `championship` VALUES(1274, 2015, 4, 1141, 150); 1286 | INSERT INTO `championship` VALUES(1275, 2015, 5, 1161, 136); 1287 | INSERT INTO `championship` VALUES(1276, 2015, 6, 1142, 121); 1288 | INSERT INTO `championship` VALUES(1277, 2015, 7, 1166, 95); 1289 | INSERT INTO `championship` VALUES(1278, 2015, 8, 1157, 92); 1290 | INSERT INTO `championship` VALUES(1279, 2015, 9, 1155, 78); 1291 | INSERT INTO `championship` VALUES(1280, 2015, 10, 1148, 58); 1292 | INSERT INTO `championship` VALUES(1281, 2015, 11, 1144, 51); 1293 | INSERT INTO `championship` VALUES(1282, 2015, 12, 1172, 49); 1294 | INSERT INTO `championship` VALUES(1283, 2015, 13, 1171, 27); 1295 | INSERT INTO `championship` VALUES(1284, 2015, 14, 1156, 27); 1296 | INSERT INTO `championship` VALUES(1285, 2015, 15, 1170, 18); 1297 | INSERT INTO `championship` VALUES(1286, 2015, 16, 1123, 16); 1298 | INSERT INTO `championship` VALUES(1287, 2015, 17, 1127, 11); 1299 | INSERT INTO `championship` VALUES(1288, 2015, 18, 1167, 9); 1300 | INSERT INTO `championship` VALUES(1289, 2016, 1, 1128, 385); 1301 | INSERT INTO `championship` VALUES(1290, 2016, 2, 1140, 380); 1302 | INSERT INTO `championship` VALUES(1291, 2016, 3, 1157, 256); 1303 | INSERT INTO `championship` VALUES(1292, 2016, 4, 1135, 212); 1304 | INSERT INTO `championship` VALUES(1293, 2016, 5, 1172, 204); 1305 | INSERT INTO `championship` VALUES(1294, 2016, 6, 1141, 186); 1306 | INSERT INTO `championship` VALUES(1295, 2016, 7, 1155, 101); 1307 | INSERT INTO `championship` VALUES(1296, 2016, 8, 1161, 85); 1308 | INSERT INTO `championship` VALUES(1297, 2016, 9, 1148, 72); 1309 | INSERT INTO `championship` VALUES(1298, 2016, 10, 1127, 54); 1310 | INSERT INTO `championship` VALUES(1299, 2016, 11, 1142, 53); 1311 | INSERT INTO `championship` VALUES(1300, 2016, 12, 1170, 46); 1312 | INSERT INTO `championship` VALUES(1301, 2016, 13, 1144, 29); 1313 | INSERT INTO `championship` VALUES(1302, 2016, 14, 1166, 25); 1314 | INSERT INTO `championship` VALUES(1303, 2016, 15, 1123, 21); 1315 | INSERT INTO `championship` VALUES(1304, 2016, 16, 1165, 7); 1316 | INSERT INTO `championship` VALUES(1305, 2016, 17, 1171, 2); 1317 | INSERT INTO `championship` VALUES(1306, 2016, 18, 1175, 1); 1318 | INSERT INTO `championship` VALUES(1307, 2016, 19, 1177, 1); 1319 | INSERT INTO `championship` VALUES(1308, 2016, 20, 1178, 1); 1320 | INSERT INTO `championship` VALUES(1309, 2017, 1, 1140, 363); 1321 | INSERT INTO `championship` VALUES(1310, 2017, 2, 1135, 317); 1322 | INSERT INTO `championship` VALUES(1311, 2017, 3, 1161, 305); 1323 | INSERT INTO `championship` VALUES(1312, 2017, 4, 1141, 205); 1324 | INSERT INTO `championship` VALUES(1313, 2017, 5, 1157, 200); 1325 | INSERT INTO `championship` VALUES(1314, 2017, 6, 1172, 168); 1326 | INSERT INTO `championship` VALUES(1315, 2017, 7, 1155, 100); 1327 | INSERT INTO `championship` VALUES(1316, 2017, 8, 1179, 87); 1328 | INSERT INTO `championship` VALUES(1317, 2017, 9, 1170, 54); 1329 | INSERT INTO `championship` VALUES(1318, 2017, 10, 1148, 43); 1330 | INSERT INTO `championship` VALUES(1319, 2017, 11, 1142, 43); 1331 | INSERT INTO `championship` VALUES(1320, 2017, 12, 1181, 40); 1332 | INSERT INTO `championship` VALUES(1321, 2017, 13, 1144, 28); 1333 | INSERT INTO `championship` VALUES(1322, 2017, 14, 1165, 19); 1334 | INSERT INTO `championship` VALUES(1323, 2017, 15, 1127, 17); 1335 | INSERT INTO `championship` VALUES(1324, 2017, 16, 1178, 13); 1336 | INSERT INTO `championship` VALUES(1325, 2017, 17, 1175, 8); 1337 | INSERT INTO `championship` VALUES(1326, 2017, 18, 1177, 5); 1338 | INSERT INTO `championship` VALUES(1327, 2017, 19, 1166, 5); 1339 | INSERT INTO `championship` VALUES(1328, 2018, 1, 1140, 408); 1340 | INSERT INTO `championship` VALUES(1329, 2018, 2, 1135, 320); 1341 | INSERT INTO `championship` VALUES(1330, 2018, 3, 1141, 251); 1342 | INSERT INTO `championship` VALUES(1331, 2018, 4, 1172, 249); 1343 | INSERT INTO `championship` VALUES(1332, 2018, 5, 1161, 247); 1344 | INSERT INTO `championship` VALUES(1333, 2018, 6, 1157, 170); 1345 | INSERT INTO `championship` VALUES(1334, 2018, 7, 1148, 69); 1346 | INSERT INTO `championship` VALUES(1335, 2018, 8, 1155, 62); 1347 | INSERT INTO `championship` VALUES(1336, 2018, 9, 1165, 56); 1348 | INSERT INTO `championship` VALUES(1337, 2018, 10, 1170, 53); 1349 | INSERT INTO `championship` VALUES(1338, 2018, 11, 1127, 50); 1350 | INSERT INTO `championship` VALUES(1339, 2018, 12, 1179, 49); 1351 | INSERT INTO `championship` VALUES(1340, 2018, 13, 1184, 39); 1352 | INSERT INTO `championship` VALUES(1341, 2018, 14, 1144, 37); 1353 | INSERT INTO `championship` VALUES(1342, 2018, 15, 1182, 29); 1354 | INSERT INTO `championship` VALUES(1343, 2018, 16, 1178, 12); 1355 | INSERT INTO `championship` VALUES(1344, 2018, 17, 1167, 9); 1356 | INSERT INTO `championship` VALUES(1345, 2018, 18, 1181, 6); 1357 | INSERT INTO `championship` VALUES(1346, 2018, 19, 1183, 4); 1358 | INSERT INTO `championship` VALUES(1347, 2018, 20, 1185, 1); 1359 | INSERT INTO `championship` VALUES(1348, 2019, 1, 1140, 413); 1360 | INSERT INTO `championship` VALUES(1349, 2019, 2, 1161, 326); 1361 | INSERT INTO `championship` VALUES(1350, 2019, 3, 1172, 278); 1362 | INSERT INTO `championship` VALUES(1351, 2019, 4, 1184, 264); 1363 | INSERT INTO `championship` VALUES(1352, 2019, 5, 1135, 240); 1364 | INSERT INTO `championship` VALUES(1353, 2019, 6, 1170, 96); 1365 | INSERT INTO `championship` VALUES(1354, 2019, 7, 1182, 95); 1366 | INSERT INTO `championship` VALUES(1355, 2019, 8, 1187, 92); 1367 | INSERT INTO `championship` VALUES(1356, 2019, 9, 1157, 54); 1368 | INSERT INTO `championship` VALUES(1357, 2019, 10, 1155, 52); 1369 | INSERT INTO `championship` VALUES(1358, 2019, 11, 1186, 49); 1370 | INSERT INTO `championship` VALUES(1359, 2019, 12, 1141, 43); 1371 | INSERT INTO `championship` VALUES(1360, 2019, 13, 1166, 37); 1372 | INSERT INTO `championship` VALUES(1361, 2019, 14, 1148, 37); 1373 | INSERT INTO `championship` VALUES(1362, 2019, 15, 1181, 21); 1374 | INSERT INTO `championship` VALUES(1363, 2019, 16, 1165, 20); 1375 | INSERT INTO `championship` VALUES(1364, 2019, 17, 1180, 14); 1376 | INSERT INTO `championship` VALUES(1365, 2019, 18, 1144, 8); 1377 | INSERT INTO `championship` VALUES(1366, 2019, 19, 1136, 1); 1378 | INSERT INTO `championship` VALUES(1367, 2019, 20, 1188, 0); 1379 | INSERT INTO `championship` VALUES(1368, 2020, 1, 1140, 347); 1380 | INSERT INTO `championship` VALUES(1369, 2020, 2, 1161, 223); 1381 | INSERT INTO `championship` VALUES(1370, 2020, 3, 1172, 214); 1382 | INSERT INTO `championship` VALUES(1371, 2020, 4, 1155, 125); 1383 | INSERT INTO `championship` VALUES(1372, 2020, 5, 1157, 119); 1384 | INSERT INTO `championship` VALUES(1373, 2020, 6, 1170, 105); 1385 | INSERT INTO `championship` VALUES(1374, 2020, 7, 1187, 105); 1386 | INSERT INTO `championship` VALUES(1375, 2020, 8, 1184, 98); 1387 | INSERT INTO `championship` VALUES(1376, 2020, 9, 1186, 97); 1388 | INSERT INTO `championship` VALUES(1377, 2020, 10, 1182, 75); 1389 | INSERT INTO `championship` VALUES(1378, 2020, 11, 1181, 75); 1390 | INSERT INTO `championship` VALUES(1379, 2020, 12, 1179, 62); 1391 | INSERT INTO `championship` VALUES(1380, 2020, 13, 1135, 33); 1392 | INSERT INTO `championship` VALUES(1381, 2020, 14, 1166, 32); 1393 | INSERT INTO `championship` VALUES(1382, 2020, 15, 1148, 10); 1394 | INSERT INTO `championship` VALUES(1383, 2020, 16, 1141, 4); 1395 | INSERT INTO `championship` VALUES(1384, 2020, 17, 1180, 4); 1396 | INSERT INTO `championship` VALUES(1385, 2020, 18, 1188, 3); 1397 | INSERT INTO `championship` VALUES(1386, 2020, 19, 1144, 2); 1398 | INSERT INTO `championship` VALUES(1387, 2020, 20, 1165, 1); 1399 | INSERT INTO `championship` VALUES(1388, 2020, 21, 1189, 0); 1400 | INSERT INTO `championship` VALUES(1389, 2020, 22, 1190, 0); 1401 | INSERT INTO `championship` VALUES(1390, 2020, 23, 1191, 0); 1402 | INSERT INTO `championship` VALUES(1391, 2021, 1, 1172, 395.5); 1403 | INSERT INTO `championship` VALUES(1392, 2021, 2, 1140, 387.5); 1404 | INSERT INTO `championship` VALUES(1393, 2021, 3, 1161, 226); 1405 | INSERT INTO `championship` VALUES(1394, 2021, 4, 1155, 190); 1406 | INSERT INTO `championship` VALUES(1395, 2021, 5, 1170, 164.5); 1407 | INSERT INTO `championship` VALUES(1396, 2021, 6, 1186, 160); 1408 | INSERT INTO `championship` VALUES(1397, 2021, 7, 1184, 159); 1409 | INSERT INTO `championship` VALUES(1398, 2021, 8, 1157, 115); 1410 | INSERT INTO `championship` VALUES(1399, 2021, 9, 1182, 110); 1411 | INSERT INTO `championship` VALUES(1400, 2021, 10, 1127, 81); 1412 | INSERT INTO `championship` VALUES(1401, 2021, 11, 1179, 74); 1413 | INSERT INTO `championship` VALUES(1402, 2021, 12, 1135, 43); 1414 | INSERT INTO `championship` VALUES(1403, 2021, 13, 1181, 34); 1415 | INSERT INTO `championship` VALUES(1404, 2021, 14, 1192, 32); 1416 | INSERT INTO `championship` VALUES(1405, 2021, 15, 1188, 16); 1417 | INSERT INTO `championship` VALUES(1406, 2021, 16, 1141, 10); 1418 | INSERT INTO `championship` VALUES(1407, 2021, 17, 1189, 7); 1419 | INSERT INTO `championship` VALUES(1408, 2021, 18, 1180, 3); 1420 | INSERT INTO `championship` VALUES(1409, 2021, 19, 1193, 0); 1421 | INSERT INTO `championship` VALUES(1410, 2021, 20, 1136, 0); 1422 | INSERT INTO `championship` VALUES(1411, 2021, 21, 1194, 0); 1423 | 1424 | 1425 | ALTER TABLE `championship` 1426 | ADD PRIMARY KEY (`id`), ADD KEY `_driver` (`_driver`); 1427 | 1428 | ALTER TABLE `championship` 1429 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=1391; 1430 | 1431 | ALTER TABLE `championship` 1432 | ADD CONSTRAINT `championship_ibfk_1` FOREIGN KEY (`_driver`) REFERENCES `drivers` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 1433 | --------------------------------------------------------------------------------