├── tests
├── .gitignore
└── test_melo.py
├── .gitignore
├── docs
├── _static
│ ├── file.png
│ ├── plus.png
│ ├── minus.png
│ ├── convergence.png
│ ├── validate_spreads.png
│ ├── validate_totals.png
│ └── quickstart_example.png
├── deploy-key.enc
├── _templates
│ └── layout.html
├── conf.py
├── deploy_script.sh
├── index.rst
├── tests.rst
├── theory.rst
├── example.rst
├── usage.rst
└── plot_tests.py
├── src
└── melo
│ ├── __init__.py
│ ├── dist.py
│ ├── melo.py
│ └── nfl.dat
├── setup.py
├── .travis.yml
├── LICENSE
├── setup.cfg
└── README.rst
/tests/.gitignore:
--------------------------------------------------------------------------------
1 | *.pyc
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | docs/_build
2 | dist/
3 | .eggs
4 | *.egg-info/
5 | *.pyc
6 |
--------------------------------------------------------------------------------
/docs/_static/file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/file.png
--------------------------------------------------------------------------------
/docs/_static/plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/plus.png
--------------------------------------------------------------------------------
/docs/deploy-key.enc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/deploy-key.enc
--------------------------------------------------------------------------------
/docs/_static/minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/minus.png
--------------------------------------------------------------------------------
/docs/_static/convergence.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/convergence.png
--------------------------------------------------------------------------------
/src/melo/__init__.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from .melo import *
4 |
5 | __version__ = '1.1.0'
6 |
--------------------------------------------------------------------------------
/docs/_static/validate_spreads.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/validate_spreads.png
--------------------------------------------------------------------------------
/docs/_static/validate_totals.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/validate_totals.png
--------------------------------------------------------------------------------
/docs/_static/quickstart_example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/morelandjs/melo/HEAD/docs/_static/quickstart_example.png
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*- coding: utf-8 -*-
3 | import setuptools
4 |
5 |
6 | def setup_package():
7 | setuptools.setup(package_data={'melo': ['nfl.dat']})
8 |
9 |
10 | if __name__=='__main__':
11 | setup_package()
12 |
--------------------------------------------------------------------------------
/docs/_templates/layout.html:
--------------------------------------------------------------------------------
1 | {% extends "!layout.html" %}
2 |
3 | {% block footer %}
4 | {{ super() }}
5 |
9 |
14 | {% endblock %}
15 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: python
2 | python:
3 | - '3.4'
4 | - '3.5'
5 | - '3.6'
6 | - '3.7'
7 | - '3.8'
8 | cache: pip
9 | addons:
10 | ssh_known_hosts: 157.230.188.74
11 | before_install:
12 | - openssl aes-256-cbc -K $encrypted_92725ca94bf5_key -iv $encrypted_92725ca94bf5_iv
13 | -in docs/deploy-key.enc -out docs/deploy-key -d
14 | install:
15 | - pip install numpy scipy>=0.18.0 sphinx sphinx_rtd_theme
16 | - pip install --verbose --editable .
17 | script:
18 | - python3 setup.py tests
19 | - python3 setup.py docs
20 | after_success:
21 | - bash docs/deploy_script.sh
22 |
--------------------------------------------------------------------------------
/docs/conf.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | import os
4 | import sys
5 |
6 | import melo
7 |
8 |
9 | sys.path.insert(0, os.path.abspath(os.pardir))
10 |
11 | project = 'melo'
12 | version = release = melo.__version__
13 | author = 'J. Scott Moreland'
14 | copyright = '2019 J. Scott Moreland'
15 |
16 | source_suffix = '.rst'
17 | master_doc = 'index'
18 |
19 | templates_path = ['_templates']
20 | html_static_path = ['_static']
21 | exclude_patterns = ['_build']
22 |
23 | extensions = [
24 | 'sphinx.ext.autodoc',
25 | 'sphinx.ext.mathjax',
26 | 'sphinx.ext.napoleon',
27 | ]
28 |
29 | default_role = 'math'
30 |
31 | html_theme = 'sphinx_rtd_theme'
32 | html_context = dict(show_source=False)
33 |
--------------------------------------------------------------------------------
/docs/deploy_script.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -x
4 |
5 | # install ssh private key
6 | cd docs
7 | openssl aes-256-cbc -K $encrypted_92725ca94bf5_key -iv $encrypted_92725ca94bf5_iv -in deploy-key.enc -out deploy-key -d
8 | rm deploy-key.enc
9 | chmod 600 deploy-key
10 | mv deploy-key ~/.ssh/id_rsa
11 |
12 | # push docs to droplet remote
13 | if [ $TRAVIS_BRANCH == "master" ]; then
14 | git init
15 |
16 | git remote add deploy "deploy@157.230.188.74:/home/deploy/melo"
17 | git config user.name "Travis CI"
18 | git config user.email "morelandjs@gmail.com"
19 |
20 | git add .
21 | git commit -m "deploy docs"
22 | git push --force deploy master
23 | else
24 | echo "not deploying, since branch is not master"
25 | fi
26 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2018 J. Scott Moreland
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in
13 | all copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/src/melo/dist.py:
--------------------------------------------------------------------------------
1 | # MELO: Margin-dependent Elo ratings and predictions
2 | # Copyright 2019 J. Scott Moreland
3 | # MIT License
4 |
5 | import numpy as np
6 | from scipy.special import erf, erfc, erfcinv, expit
7 |
8 |
9 | class normal:
10 | """
11 | Normal probability distribution function
12 |
13 | """
14 | @staticmethod
15 | def cdf(x, loc=0, scale=1):
16 | """
17 | Cumulative distribution function
18 |
19 | """
20 | return 0.5*(1 + erf((x - loc)/(scale*np.sqrt(2))))
21 |
22 | @staticmethod
23 | def sf(x, loc=0, scale=1):
24 | """
25 | Survival function
26 |
27 | """
28 | return 0.5*erfc((x - loc)/(scale*np.sqrt(2)))
29 |
30 | @staticmethod
31 | def isf(x, loc=0, scale=1):
32 | """
33 | Inverse survival function
34 |
35 | """
36 | return scale*np.sqrt(2)*erfcinv(2*x) + loc
37 |
38 |
39 | class logistic:
40 | """
41 | Logistic probability distribution function
42 |
43 | """
44 | @staticmethod
45 | def cdf(x, loc=0, scale=1):
46 | """
47 | Cumulative distribution function
48 |
49 | """
50 | return expit((x - loc)/scale)
51 |
52 | @staticmethod
53 | def sf(x, loc=0, scale=1):
54 | """
55 | Survival function
56 |
57 | """
58 | return 1 - expit((x - loc)/scale)
59 |
60 | @staticmethod
61 | def isf(x, loc=0, scale=1):
62 | """
63 | Inverse survival function
64 |
65 | """
66 | np.seterr(divide='ignore')
67 | return scale*np.log(np.divide(1 - x, x)) + loc
68 |
--------------------------------------------------------------------------------
/setup.cfg:
--------------------------------------------------------------------------------
1 | [metadata]
2 | name = melo
3 | version = attr: melo.__version__
4 | description = Margin dependent Elo ratings and predictions.
5 | long_description = file: README.rst
6 | long_description_content_type = text/reStructuredText
7 | author = J. Scott Moreland
8 | author_email = morelandjs@gmail.com
9 | url = 'https://github.com/melo.git'
10 | license = 'MIT',
11 | platforms = any
12 | classifiers =
13 | Development Status :: 5 - Production/Stable
14 | Intended Audience :: Science/Research
15 | License :: OSI Approved :: MIT License
16 | Programming Language :: Python
17 | Programming Language :: Python :: 2
18 | Programming Language :: Python :: 2.7
19 | Programming Language :: Python :: 3
20 | Programming Language :: Python :: 3.4
21 | Programming Language :: Python :: 3.5
22 | Programming Language :: Python :: 3.6
23 | Programming Language :: Python :: 3.7
24 |
25 | [options]
26 | zip_safe = False
27 | include_package_data = True
28 | packages = find:
29 | package_dir =
30 | =src
31 | setup_requires =
32 | pytest-runner
33 | install_requires =
34 | numpy
35 | scipy >= 0.18.0
36 | tests_require =
37 | pytest
38 |
39 | [options.packages.find]
40 | where = src
41 | exclude = tests
42 |
43 | [test]
44 | addopts = tests
45 |
46 | [tool.pytest]
47 | minversion = 6.0
48 | addopts = tests --verbose -s
49 | norecursedirs =
50 | dist
51 | build
52 | .tox
53 |
54 | [aliases]
55 | tests = pytest
56 | docs = build_sphinx
57 |
58 | [bdist_wheel]
59 | universal = True
60 |
61 | [build_sphinx]
62 | source_dir = docs
63 | build_dir = docs/_build
64 |
65 | [flake8]
66 | max-line-length = 80
67 | doctests = True
68 | exclude = .git, .eggs, .pyc, tests, docs, dist, _build
69 |
--------------------------------------------------------------------------------
/README.rst:
--------------------------------------------------------------------------------
1 | MELO
2 | ====
3 |
4 | *Margin-dependent Elo ratings and predictions model*
5 |
6 | .. image:: https://travis-ci.org/morelandjs/melo.svg?branch=master
7 | :target: https://travis-ci.org/morelandjs/melo
8 |
9 | Documentation
10 | -------------
11 |
12 | `moreland.dev/projects/melo `_
13 |
14 | Quick start
15 | -----------
16 |
17 | Requirements: Python 2.7 or 3.3+ with numpy_ and scipy_.
18 |
19 | Install the latest release with pip_::
20 |
21 | pip install melo
22 |
23 | Example usage::
24 |
25 | import pkgutil
26 | import numpy as np
27 | from melo import Melo
28 |
29 | # the package comes pre-bundled with an example dataset
30 | pkgdata = pkgutil.get_data('melo', 'nfl.dat').splitlines()
31 | dates, teams_home, scores_home, teams_away, scores_away = zip(
32 | *[l.split() for l in pkgdata[1:]])
33 |
34 | # define a binary comparison statistic
35 | spreads = [int(h) - int(a) for h, a
36 | in zip(scores_home, scores_away)]
37 |
38 | # hyperparameters and options
39 | k = 0.245
40 | lines = np.arange(-50.5, 51.5)
41 | regress = lambda months: .413 if months > 3 else 0
42 | regress_unit = 'month'
43 | commutes = False
44 |
45 | # initialize the estimator
46 | nfl_spreads = Melo(k, lines=lines, commutes=commutes,
47 | regress=regress, regress_unit=regress_unit)
48 |
49 | # fit the estimator to the training data
50 | nfl_spreads.fit(dates, teams_home, teams_away, spreads)
51 |
52 | # specify a comparison time
53 | time = nfl_spreads.last_update
54 |
55 | # predict the mean outcome at that time
56 | mean = nfl_spreads.mean(time, 'CLE', 'KC')
57 | print('CLE VS KC: {}'.format(mean))
58 |
59 | # rank nfl teams at end of 2018 regular season
60 | rankings = nfl_spreads.rank(time, statistic='mean')
61 | for team, rank in rankings:
62 | print('{}: {}'.format(team, rank))
63 |
64 | .. _numpy: http://www.numpy.org
65 | .. _pip: https://pip.pypa.io
66 | .. _scipy: https://www.scipy.org
67 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | melo
2 | ====
3 |
4 | *Margin-dependent Elo ratings and predictions model*
5 |
6 | * Author: J\. Scott Moreland
7 | * Language: Python
8 | * Source code: `github:morelandjs/melo `_
9 |
10 | ``melo`` generalizes the `Bradley-Terry `_ paired comparison model beyond binary outcomes to include margin-of-victory information. It does this by "redefining what it means to win" using a variable handicap to shift the threshold of paired comparison. The framework is general and has numerous applications in ranking, estimation, and time series prediction.
11 |
12 | Quick start
13 | -----------
14 |
15 | Requirements: Python 2.7 or 3.3+ with numpy_ and scipy_.
16 |
17 | Install the latest release with pip_: ::
18 |
19 | pip install melo
20 |
21 | Example usage: ::
22 |
23 | import pkgutil
24 | import numpy as np
25 | from melo import Melo
26 |
27 |
28 | # the package comes pre-bundled with an example dataset
29 | pkgdata = pkgutil.get_data('melo', 'nfl.dat').splitlines()
30 | dates, teams_home, scores_home, teams_away, scores_away = zip(
31 | *[l.split() for l in pkgdata[1:]])
32 |
33 | # define a binary comparison statistic
34 | spreads = [int(h) - int(a) for h, a
35 | in zip(scores_home, scores_away)]
36 |
37 | # hyperparameters and options
38 | k = 0.245
39 | lines = np.arange(-59.5, 60.5)
40 | regress = lambda months: .413 if months > 3 else 0
41 | regress_unit = 'month'
42 | commutes = False
43 |
44 | # initialize the estimator
45 | nfl_spreads = Melo(k, lines=lines, commutes=commutes,
46 | regress=regress, regress_unit=regress_unit)
47 |
48 | # fit the estimator to the training data
49 | nfl_spreads.fit(dates, teams_home, teams_away, spreads)
50 |
51 | # specify a comparison time
52 | time = nfl_spreads.last_update
53 |
54 | # predict the mean outcome at that time
55 | mean = nfl_spreads.mean(time, 'CLE', 'KC')
56 | print('CLE VS KC: {}'.format(mean))
57 |
58 | # rank nfl teams at end of 2018 regular season
59 | rankings = nfl_spreads.rank(time, statistic='mean')
60 | for team, rank in rankings:
61 | print('{}: {}'.format(team, rank))
62 |
63 | .. toctree::
64 | :caption: User guide
65 | :maxdepth: 2
66 |
67 | usage
68 | example
69 |
70 | .. toctree::
71 | :caption: Technical info
72 | :maxdepth: 2
73 |
74 | theory
75 | tests
76 |
77 | .. _numpy: http://www.numpy.org
78 | .. _pip: https://pip.pypa.io
79 | .. _scipy: https://www.scipy.org
80 |
--------------------------------------------------------------------------------
/docs/tests.rst:
--------------------------------------------------------------------------------
1 | Tests
2 | =====
3 |
4 | ``melo`` has a standard set of unit tests, whose current CI status is:
5 |
6 | .. image:: https://travis-ci.org/morelandjs/melo.svg?branch=master
7 | :target: https://travis-ci.org/morelandjs/melo
8 |
9 | The unit tests do not check the physical accuracy of the model which is difficult to verify automatically.
10 | Rather, this page shows a number of visual tests which can be used to access the model manually.
11 |
12 | Toy model
13 | ---------
14 |
15 | Consider a fictitious "sports league" of eight teams. Each team samples points from a `Poisson distribution `_ `X_\text{team} \sim \text{Pois}(\lambda_\text{team})` where `\lambda_\text{team}` is one of eight numbers
16 |
17 | .. math::
18 | \lambda_\text{team} \in \{90, 94, 98, 100, 102, 106, 110\}
19 |
20 | specifying the team's mean expected score. I simulate a series of games between the teams by sampling pairs `(\lambda_\text{team1}, \lambda_\text{team2})` with replacement from the above values. Then, for each game and team, I sample a Poisson number and record the result, producing a tuple
21 |
22 | .. math::
23 | (\text{time}, \text{team1}, \text{score1}, \text{team2}, \text{score2}),
24 |
25 | where time is a np.datetime64 object recording the time of the comparison, `\text{team1}` and `\text{team2}` are strings labeling each team by their `\lambda` values, and `\text{score1}` and `\text{score2}` are random integers. This process is repeated `\mathcal{O}(10^6)` times to accumulate a large number of games.
26 |
27 | Point spread validation
28 | -----------------------
29 |
30 | I then calculate the score difference or `\text{spread} \equiv \text{score1} - \text{score2}` for each game to form a list of comparisons `(\text{time}, \text{team1}, \text{team2}, \text{spread})` and use these comparisons to train the margin-dependent Elo model: ::
31 |
32 | lines = np.arange(-49.5, 50.5)
33 | model = Melo(1e-4, lines=lines, commutes=False)
34 | model.fit(times, teams1, teams2, spreads)
35 |
36 | Now that the model is trained, I can predict the probability that various matchups cover each value of the line, i.e\. `P(\text{spread} > \text{line})`. Since the underlying distributions are known, I can validate these predictions using their analytic results.
37 |
38 | .. figure:: _static/validate_spreads.png
39 | :alt: minimum bias spread distribution
40 |
41 | The top panel validates the model's prior predictions (before the first game), and the bottom panel validates its posterior predictions (after the last game). The colored dots are model predictions and the black lines are their target values.
42 |
43 | Point total validation
44 | ----------------------
45 |
46 | .. figure:: _static/validate_totals.png
47 | :alt: minimum bias total distribution
48 |
49 | This figure is the same as above but for predictions of each game's point total.
50 |
--------------------------------------------------------------------------------
/tests/test_melo.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 |
3 | from nose.tools import assert_almost_equal, assert_raises
4 | import warnings
5 |
6 | import numpy as np
7 |
8 | from melo import Melo
9 |
10 |
11 | def test_class_init():
12 | """
13 | Checking melo class constructor
14 |
15 | """
16 | # dummy class instance
17 | melo = Melo(0, lines=np.array(0))
18 |
19 | # assert commutes=False requires symmetric lines
20 | assert_raises(ValueError, Melo, 0, [-1, 2])
21 |
22 | # single comparison
23 | time = np.datetime64('now')
24 | label1 = 'alpha'
25 | label2 = 'beta'
26 | value = np.random.uniform(-10, 10)
27 |
28 | # fit to the training data
29 | melo.fit(time, label1, label2, value)
30 |
31 | # multiple comparisons
32 | times = np.arange(100).astype('datetime64[s]')
33 | labels1 = np.repeat('alpha', 100)
34 | labels2 = np.repeat('beta', 100)
35 | values = np.random.normal(0, 10, size=100)
36 |
37 | # randomize times
38 | np.random.shuffle(times)
39 | melo.fit(times, labels1, labels2, values)
40 | training_data = melo.training_data
41 |
42 | # check comparison length
43 | assert training_data.shape == (100,)
44 |
45 | # check that comparisons are sorted
46 | assert np.array_equal(
47 | np.sort(training_data.time), training_data.time)
48 |
49 | # check first and last times
50 | assert melo.first_update == times.min()
51 | assert melo.last_update == times.max()
52 |
53 |
54 | def test_prior_rating():
55 | """
56 | Checking prior (default) rating
57 |
58 | """
59 | # dummy class instance
60 | melo = Melo(0)
61 |
62 | # generic comparison data
63 | times = np.arange(100).astype('datetime64[s]')
64 | labels1 = np.repeat('alpha', 100)
65 | labels2 = np.repeat('beta', 100)
66 |
67 | # test null rating for 50-50 outcome
68 | values = np.append(np.ones(50), -np.ones(50))
69 | melo.fit(times, labels1, labels2, values)
70 | prob = melo.probability(0, 'alpha', 'beta')
71 | assert_almost_equal(prob, .5)
72 |
73 | # test null rating for 10-90 outcome
74 | values = np.append(np.ones(10), -np.ones(90))
75 | melo.fit(times, labels1, labels2, values)
76 | prob = melo.probability(0, 'alpha', 'beta')
77 | assert_almost_equal(prob, .1)
78 |
79 |
80 | def test_evolve():
81 | """
82 | Checking rating regression
83 |
84 | """
85 | # random rating decay
86 | rating_decay = np.random.rand()
87 |
88 | # create a typical regression function
89 | def regress(time):
90 | return 1 - np.exp(-rating_decay*time)
91 |
92 | # melo class instance
93 | melo = Melo(0, regress=regress, regress_unit='year')
94 |
95 | # fit the model to some data
96 | melo.fit(np.datetime64('now'), 'alpha', 'beta', 0)
97 |
98 | # fix the prior rating
99 | melo.prior_rating = 0
100 |
101 | # check that the ratings are properly regressed to the mean
102 | for years in range(4):
103 | nsec = int(years*melo.seconds['year'])
104 | seconds = np.timedelta64(nsec, 's')
105 | assert melo.evolve(1, melo.prior_rating, seconds) == 1 - regress(years)
106 |
107 |
108 | def test_query_rating():
109 | """
110 | Checking rating query function
111 |
112 | """
113 | # dummy class instance
114 | melo = Melo(0)
115 |
116 | # single entry
117 | time = np.datetime64('now')
118 | label1 = 'alpha'
119 | label2 = 'beta'
120 | value = np.random.uniform(-10, 10)
121 |
122 | # train the model
123 | melo.fit(time, label1, label2, value)
124 |
125 | one_hour = np.timedelta64(1, 'h')
126 | melo.ratings_history['alpha'] = np.rec.array(
127 | [(time - one_hour, 1), (time, 2), (time + one_hour, 3)],
128 | dtype=[('time', 'datetime64[s]'), ('rating', 'float', 1)]
129 | )
130 |
131 | rating = melo.query_rating(time, 'alpha')
132 | assert_almost_equal(rating, 1)
133 |
134 | rating = melo.query_rating(time + one_hour, 'alpha')
135 | assert_almost_equal(rating, 2)
136 |
137 |
138 | def test_rate():
139 | """
140 | Checking core rating function
141 |
142 | """
143 | # dummy class instance
144 | melo = Melo(2)
145 |
146 | # alpha wins, beta loses
147 | times = np.arange(2).astype('datetime64[s]')
148 | labels1 = np.repeat('alpha', 2)
149 | labels2 = np.repeat('beta', 2)
150 | values = [1, -1]
151 |
152 | # instantiate ratings
153 | melo.fit(times, labels1, labels2, values)
154 |
155 | # rating_change = k * (obs - prior) = 2 * (1 - .5)
156 | rec = melo.ratings_history
157 | assert rec['alpha'].rating[0] == 1
158 | assert rec['beta'].rating[0] == -1
159 |
--------------------------------------------------------------------------------
/docs/theory.rst:
--------------------------------------------------------------------------------
1 | .. _theory:
2 |
3 | Theory
4 | ======
5 |
6 | The margin-dependent Elo model is introduced in preprint `arXiv:1802.00527 `_.
7 | The following is a short primer on the subject.
8 |
9 | Introduction
10 | ------------
11 |
12 | The Elo rating system is a method for predicting the outcome of paired comparisons in win/loss games such as chess.
13 | Players (or teams) are assigned a rating :math:`R` which encodes their true skill level.
14 | By convention, larger ratings correspond to higher skill levels and smaller ratings to lower skill levels.
15 |
16 | Consider two players named "Lisa" and "Mark" which play some win/loss game.
17 | Suppose Lisa has an Elo rating `R_\text{Lisa}` and Mark has a rating `R_\text{Mark}`.
18 | The probability that Lisa beats Mark at the game is given by
19 |
20 | .. math::
21 |
22 | P_\text{pred}(\text{Lisa} > \text{Mark}) = F(R_\text{Lisa} - R_\text{Mark}),
23 |
24 | where `F` is a cumulative distribution function (CDF), typically assumed to be the logistic or normal distribution CDF with location zero and arbitrary scale parameter.
25 | Here I'm slightly abusing the notation of the inequality operator to indicate "Lisa beats Mark".
26 |
27 | If Lisa beats Mark, she takes some of his rating and adds it to her own (and *vice versa*).
28 | The amount of rating that Lisa steals when she wins (or forfeits when she loses) is related to her rating difference relative to Mark,
29 |
30 | .. math::
31 |
32 | \Delta R_\text{Lisa} = k~(P_\text{obs} - P_\text{pred}),
33 |
34 | where `P_\text{obs} = 1` if Lisa wins and `P_\text{obs} = 0` if she loses, while `P_\text{obs} = 0.5` is often used if both players tie.
35 | Here `k` is a free parameter which controls how dramatically the ratings respond to each game outcome.
36 |
37 | Following this prescription, one can easily calculate the Elo ratings for multiple players in a league and use those ratings to rank the players and calculate their relative win probabilities.
38 |
39 | Moving beyond win/loss outcomes
40 | -------------------------------
41 |
42 | The traditional Elo rating system is only defined for win/loss games where each outcome is binary (or tertiary if there are ties).
43 | The margin-dependent Elo model extends the traditional Elo framework to account for margin-of-victory information.
44 |
45 | The key insight is to realize that the definition of "winning" is arbitrary.
46 | Typically we associate winning with scoring more points than the opponent but that need not be the case.
47 | Suppose, as before, that Lisa and Mark play each other in a game, but this time the game is point-based.
48 |
49 | Imagine an operator :math:`\mathcal{C}` which performs a comparison on an ordered tuple `(\text{Lisa}, \text{Mark})` and evaluates to True or False.
50 | In the traditional Elo system, this operator merely determines the winner of the game
51 |
52 | .. math::
53 |
54 | \mathcal{C}(\text{Lisa}, \text{Mark}) \equiv (\text{Lisa} > \text{Mark}).
55 |
56 | Meanwhile, for a point-based game, the analogous comparison operator is
57 |
58 | .. math::
59 |
60 | \mathcal{C}(\text{Lisa}, \text{Mark}) \equiv (S_\text{Lisa} > S_\text{Mark})
61 |
62 | where `S_\text{Lisa}` and `S_\text{Mark}` are Lisa and Mark's respective scores.
63 | This comparison operator defines "winning" as outscoring the opponent.
64 |
65 | Alternatively, we can imagine a comparison operator :math:`\mathcal{C}_\ell` that defines winning subject to a variable handicap `\ell`:
66 |
67 | .. math::
68 |
69 | \mathcal{C}_\ell(\text{Lisa}, \text{Mark}) \equiv (S_\text{Lisa} - S_\text{Mark} > \ell).
70 |
71 | Imagine now that I insist that this is the correct criteria to determine the winner of each game (after all the rules are arbitrary), and I ask you to compute the game's Elo ratings as before subject to this criteria.
72 |
73 | This comparison operator essentially splits one fair game into two biased games: in one version of the game Lisa is handicapped by `\ell` points and in the other she is advantaged by `\ell` points.
74 | Consequently, we'll need two Elo ratings for every value of `\ell`: a handicapped rating `R_\text{hcap}(\ell)` and an advantaged rating `R_{adv}(\ell)`.
75 | However, since being handicapped by `\ell` is equivalent to being advantaged by `-\ell`, we'll only need a single margin-dependent rating `R(\ell)`.
76 |
77 | The predicted probability of the comparison `\mathcal{C}_\ell` is therefore given by
78 |
79 | .. math::
80 |
81 | P_\text{pred}(\ell) = F[R_\text{Lisa}(\ell) - R_\text{Mark}(-\ell)].
82 |
83 | Hence Lisa's rating change is given by
84 |
85 | .. math::
86 |
87 | \Delta R_\text{Lisa}(\ell) = k~[P_\text{obs}(\ell) - P_\text{pred}(\ell)],
88 |
89 | where `P_\text{obs}(\ell) = \Theta[\ell - (S_\text{Lisa} - S_\text{Mark})]` and `\Theta` is the Heaviside step function.
90 | The points lost by the handicapped rating are absorbed by the advantaged rating so
91 |
92 | .. math::
93 |
94 | \Delta R_\text{Mark}(-\ell) = -\Delta R_\text{Lisa}(\ell)
95 |
96 | And that's it!
97 | We've generalized the Elo model to point based games.
98 | In practice, the ratings `R(\ell)` are discretized by calculating their values at several values of the lines
99 |
100 | .. math::
101 |
102 | R(\ell) \to [R(\ell_\text{min}), R(\ell_\text{min} + \Delta \ell), \dots, R(\ell_\text{max})].
103 |
104 | .. note::
105 |
106 | In the traditional Elo rating system, every rating is initialized to the same value.
107 | For the margin-dependent Elo model, the ratings vector is initialized so the model predicts minimum-bias point spreads for each game.
108 |
109 | Commutative comparisons
110 | -----------------------
111 |
112 | The previous discussion describes the margin-dependent Elo model for point spreads (points scored minus points allowed).
113 | This particular observable anti-commutes under label interchange, i.e\.
114 |
115 | .. math::
116 |
117 | \text{Spread}(\text{Lisa}, \text{Mark}) = -\text{Spread}(\text{Mark}, \text{Lisa}).
118 |
119 | It's also possible to estimate Elo ratings and predictions for point totals (points scored plus points allowed) which *commute* under label interchange
120 |
121 | .. math::
122 |
123 | \text{Total}(\text{Lisa}, \text{Mark}) = \text{Total}(\text{Mark}, \text{Lisa}).
124 |
125 | The model requires two small adjustments.
126 | The predicted probability becomes the *sum* of each rating
127 |
128 | .. math::
129 |
130 | P_\text{pred}(\ell) = F[R_\text{Lisa}(\ell) + R_\text{Mark}(\ell)],
131 |
132 | and Lisa's rating change becomes equal to Mark's,
133 |
134 | .. math::
135 |
136 | \Delta R_\text{Lisa}(\ell) = \Delta R_\text{Mark}(\ell).
137 |
138 | Note, this means that the game outcomes (and ratings) are no longer zero sum.
139 | Both competitors can cover a given point total line with higher probability.
140 |
--------------------------------------------------------------------------------
/docs/example.rst:
--------------------------------------------------------------------------------
1 | .. _example:
2 |
3 | Example
4 | =======
5 |
6 | The ``melo`` package comes pre-bundled with a text file containing the final score of all regular season NFL games 2009–2018.
7 | Let's load this dataset and use the model to predict the point spread and point total of "future" games using the historical game data.
8 |
9 | Training data
10 | -------------
11 |
12 | First, let's import ``Melo`` and load the ``nfl.dat`` package data.
13 | Let's also load numpy_ for convenience. ::
14 |
15 | import pkgutil
16 | import numpy as np
17 |
18 | from melo import Melo
19 |
20 | # the package comes pre-bundled with an example NFL dataset
21 | pkgdata = pkgutil.get_data('melo', 'nfl.dat').splitlines()
22 |
23 | The ``nfl.dat`` package data looks like this:
24 |
25 | .. code-block:: text
26 |
27 | # date, home, score, away, score
28 | 2009-09-10 PIT 13 TEN 10
29 | 2009-09-13 ATL 19 MIA 7
30 | 2009-09-13 BAL 38 KC 24
31 | 2009-09-13 CAR 10 PHI 38
32 | 2009-09-13 CIN 7 DEN 12
33 | 2009-09-13 CLE 20 MIN 34
34 | 2009-09-13 HOU 7 NYJ 24
35 | 2009-09-13 IND 14 JAC 12
36 | 2009-09-13 NO 45 DET 27
37 | 2009-09-13 TB 21 DAL 34
38 | 2009-09-13 ARI 16 SF 20
39 | 2009-09-13 NYG 23 WAS 17
40 | ...
41 |
42 | After we've loaded the package data, we'll need to split the game data into separate columns. ::
43 |
44 | dates, teams_home, scores_home, teams_away, scores_away = zip(
45 | *[l.split() for l in pkgdata[1:]])
46 |
47 | Point spread predictions
48 | ------------------------
49 |
50 | Let's start by analyzing the home team point spreads. ::
51 |
52 | spreads = [int(h) - int(a) for h, a in zip(scores_home, scores_away)]
53 |
54 | Note, if I swap the order of ``scores_home`` and ``scores_away``, my definition of the point spread picks up a minus sign.
55 | This means the point spread binary comparison *anti*-commutes under label interchange.
56 | Let's define a new constant to pass this information to the ``Melo`` class constructor. ::
57 |
58 | commutes = False
59 |
60 | Much like traditional Elo ratings, the ``melo`` model includes a hyperparameter ``k`` which controls how fast the ratings update.
61 | Prior experience indicates that ::
62 |
63 | k = 0.245
64 |
65 | is a good choice for NFL games.
66 | Generally speaking, this hyperparameter must be tuned for each use case.
67 |
68 | Next, we need to specify a one-dimensional array of point spread thresholds.
69 | The vast majority of NFL spreads fall between -59.5 and 59.5 points, so let's partition the point spreads within this range.
70 | Here I choose half-point lines in one-point increments so there is no ambiguity as to whether a comparison falls above or below a given threshold. ::
71 |
72 | lines = np.arange(-59.5, 60.5)
73 |
74 | Additionally, let's also specify a function which describes how much the ratings should regress to the mean as a function of elapsed time between games.
75 | Here I regress the ratings to the mean by a fixed fraction each off season. To accomplish this, I create a function ::
76 |
77 | def regress(dormant_months):
78 | """
79 | Regress ratings to the mean by 40% if the team
80 | has not played for three or more months
81 |
82 | """
83 | return .4 if dormant_months > 3 else 0
84 |
85 | and define a constant to specify the units of the decay function time argument (see `Usage `_ for available options). ::
86 |
87 | regress_unit = 'month'
88 |
89 | Using the previous components, the model estimator is initialized as follows: ::
90 |
91 | nfl_spreads = Melo(k, lines=lines, commutes=commutes,
92 | regress=regress, regress_unit=regress_unit)
93 |
94 | Note, at this point we have not trained the model on any data yet.
95 | We've simply specified some necessary hyperparameters and options.
96 | Assembling the previous components, the model is trained by calling its fit function on the previously defined training data: ::
97 |
98 | nfl_spreads.fit(dates, teams_home, teams_away, spreads)
99 |
100 | Once the model is fit to the data, we can easily generate predictions by calling its various instance methods: ::
101 |
102 | # time one day after the last model update
103 | time = nfl_spreads.last_update + np.timedelta64(1, 'D')
104 |
105 | # predict the mean outcome at 'time'
106 | nfl_spreads.mean(time, 'CLE', 'KC')
107 |
108 | # predict the median outcome at 'time'
109 | nfl_spreads.median(time, 'CLE', 'KC')
110 |
111 | # predict the interquartile range at 'time'
112 | nfl_spreads.quantile(time, 'CLE', 'KC', q=[.25, .5, .75])
113 |
114 | # predict the win probability at 'time'
115 | nfl_spreads.probability(time, 'CLE', 'KC')
116 |
117 | # generate prediction samples at 'time'
118 | nfl_spreads.sample(time, 'CLE', 'KC', size=100)
119 |
120 | .. note::
121 |
122 | Furthermore, the model can rank teams by their expected performance against a league average opponent on a neutral field.
123 | Let's evaluate this ranking at the end of the 2018–2019 season. ::
124 |
125 | # end of the 2018–2019 season
126 | time = nfl_spreads.last_update + np.timedelta64(1, 'D')
127 |
128 | # rank teams by expected mean spread against average team
129 | nfl_spreads.rank(time, statistic='mean')
130 |
131 | Or alternatively, we can rank teams by their expected win probability against a league average opponent: ::
132 |
133 | # rank teams by expected win prob against average team
134 | nfl_spreads.rank(time, statistic='win')
135 |
136 | Point total predictions
137 | -----------------------
138 |
139 | Everything demonstrated so far can also be applied to point total comparisons with a few small changes.
140 | First, let's create the array of point total comparisons. ::
141 |
142 | totals = [int(h) + int(a) for h, a in zip(scores_home, scores_away)]
143 |
144 | Next, we'll need to change our lines so they cover the expected range of point total comparisons: ::
145 |
146 | lines = np.arange(-0.5, 105.5)
147 |
148 | Additionally, we'll need to set ::
149 |
150 | commutes = True
151 |
152 | since the point total comparisons are invariant under label interchange.
153 | Finally, we'll want to provide somewhat different inputs for the k and regress arguments.
154 | Putting the pieces together: ::
155 |
156 | nfl_totals = Melo(.245, lines=lines, commutes=True,
157 | regress=lambda months: .3 if months > 3 else 0,
158 | regress_unit='month')
159 |
160 | nfl_totals.fit(dates, teams_home, teams_away, totals)
161 |
162 | And voila! We can easily predict the outcome of a future point total comparison. ::
163 |
164 | # time one day after the last model update
165 | time = nfl_totals.last_update + np.timedelta64(1, 'D')
166 |
167 | # predict the mean outcome at 'time'
168 | nfl_totals.mean(time, 'CLE', 'KC')
169 |
170 |
171 | .. _numpy: http://www.numpy.org
172 |
--------------------------------------------------------------------------------
/docs/usage.rst:
--------------------------------------------------------------------------------
1 | Usage
2 | =====
3 |
4 | ``melo`` is a computer model to generate rankings and predictions from paired comparison time series data.
5 | It has obvious applications to sports, but the framework is general and can be used for numerous other purposes including consumer surveys and asset pricing.
6 |
7 | Overview
8 | --------
9 |
10 | This is a brief overview of the ``melo`` Python package.
11 | See `Theory `_ for an explanation of the underlying math.
12 |
13 | 1. Initialization
14 | ^^^^^^^^^^^^^^^^^
15 |
16 | First, import the Melo class. ::
17 |
18 | from melo import Melo
19 |
20 | Next, create a Melo class object and specify its constructor arguments. ::
21 |
22 | melo_instance = Melo(
23 | k, lines=lines, sigma=sigma, regress=regress,
24 | regress_unit=regress_unit, dist=dist, commutes=commutes
25 | )
26 |
27 | Parameters
28 | """"""""""
29 |
30 | * **k** *(float)* -- At bare minimum, you'll need to specify the rating update factor k which is the first and only positional argument. The k factor controls the magnitude of each rating update, with larger k values making the model more responsive to each comparison outcome. Its value should be chosen by minimizing the model's predictive error.
31 |
32 | * **lines** *(array_like of float, optional)* -- The lines array specifies the sequence of binary comparison thresholds. The default, lines=0, corresponds to a classical Elo model where the comparison outcome is True if the value is greater than 0 and False otherwise. In general, you'll want to create an array of lines spanning the range of possible outcomes (see `Example `_).
33 |
34 | * **sigma** *(float, optional)* -- This parameter adds some uncertainty to each observed value when training the model. When sigma=0 (default), the comparison is True if the value exceeds a given line and False otherwise. For sigma > 0, it gives the comparison operator (step function) a soft edge of width sigma. Small sigma values generally help to smooth and regulate the model predictions.
35 |
36 | * **regress** *(function, optional)* -- This argument provides an entry point for implementing rating decay. It must be a scalar function of one input variable (elapsed time) which returns a single number (fractional regression to the mean). The default, regress = lambda time: 0, applies no regression to the mean as a function of elapsed time.
37 |
38 | * **regress_unit** *(string, optional)* -- Sets the elapsed time units of the regress function. Options are: year (default), month, week, day, hour, minute, second, millisecond, microsecond, nanosecond, picosecond, femtosecond, and attosecond. For example, suppose regress_unit='year' and regress = lambda time: 0.2 if time > 1 else 0. This means the model will regress each rating to the mean by 20% if the elapsed time since the last update is greater than one year.
39 |
40 | * **dist** *(string, optional)* -- Specifies the type of distribution function used to convert rating differences into probabilities. Options are normal (default) and logistic. Switching distribution types will generally require somewhat different hyperparameters.
41 |
42 | * **commutes** *(bool, optional)* -- This parameter describes the expected behavior of the estimated values under label interchange. If commutes=False, it is assumed that the comparisons anti-commute under label interchange (default behavior), and if commutes=True, it is assumed they commute. For example, point totals require commutes=True and point spreads require commutes=False.
43 |
44 | 2. Training data
45 | ^^^^^^^^^^^^^^^^
46 |
47 | Each ``melo`` training **input** is a tuple of the form ``(time, label1, label2)`` and each training **output** is a single number ``value``.
48 | This training data is passed to the model as four array_like objects of equal length:
49 |
50 | * times is an array_like object of type np.datetime64 (or compatible string). It specifies the time at which the comparison was made.
51 | * labels1 and labels2 are array_like objects of type string. They specify the first and second label names of the entities involved in the comparison.
52 | * values is an array_like object of type float. It specifies the numeric value of the comparison, e.g. the value of the point spread or point total.
53 |
54 | .. warning::
55 | It is assumed that the elements of each array match up, i.e\. the n-th element of each array should correspond to the same comparison.
56 | It is not necessary that the comparisons are time ordered.
57 |
58 | For example, the data used to train the model might look like the following: ::
59 |
60 | times = ['2009-09-10', '2009-09-13', '2009-09-13']
61 | labels1 = ['PIT', 'ATL', 'BAL']
62 | labels2 = ['TEN', 'MIA', 'KC']
63 | values = [3, 12, 14]
64 |
65 | 3. Model calibration
66 | ^^^^^^^^^^^^^^^^^^^^
67 |
68 | The model is calibrated by calling the fit function on the training data. ::
69 |
70 | melo_instance.fit(times, labels1, labels2, values, biases=0)
71 |
72 | Optionally, when training the model you can specify ``biases`` (float or array_like of floats). These are numbers which add to (or subtract from) the rating difference of each comparison, i.e.
73 |
74 | .. math::
75 | \Delta R = R_\text{label1} - R_\text{label2} + \text{bias}.
76 |
77 | These factors can be used to account for transient advantages and disadvantages such as weather and temporary injuries.
78 | Positive bias numbers increase the expected value of the comparison, and negative values decrease it.
79 | If ``biases`` is a single number, the bias factor is assumed to be constant for all comparisons.
80 | Otherwise, there must be a bias factor for every training input.
81 |
82 | .. note::
83 | The model automatically accounts for global spread bias such as that associated with home field advantage.
84 | To take advantage of this functionality, the label entries should be ordered such that the bias is alligned with the first (or second) label.
85 |
86 | 4. Making predictions
87 | ^^^^^^^^^^^^^^^^^^^^^
88 |
89 | Once the model is fit to the training data, there are a number of different functions which can be called to generate predictions for new comparisons at arbitrary points in time.
90 |
91 | At the most basic level, the model predicts the survival function probability distribution :math:`P(\text{value} > \text{line})` as a function of the line.
92 | This distribution is generated by the function call ::
93 |
94 | melo_instance.probability(times, labels1, labels2, biases=biases, lines=lines)
95 |
96 | where times, labels1, labels2, and biases are the prediction inputs, and lines is the array of lines where the probability is to be estimated.
97 |
98 | However, this function call is just the tip of the iceberg. Given this information, the model can predict many other interesting quantities such as the mean and median comparison values ::
99 |
100 | melo_instance.mean(times, labels1, labels2, biases=biases)
101 |
102 | melo_instance.median(times, labels1, labels2, biases=biases)
103 |
104 | ...arbitrary percentiles (or quantiles) of the distribution ::
105 |
106 | melo_instance.percentile(times, labels1, labels2, biases=biases, p=[10, 50, 90])
107 |
108 | and it can even draw samples from the estimated survival function probability distribution ::
109 |
110 | melo_instance.sample(times, labels1, labels2, biases=biases, size=100)
111 |
112 | Perhaps one of the most useful applications of the model is using its mean and median predictions to create rankings. This is aided by the rank function ::
113 |
114 | melo_instance.rank(time, statistic='mean')
115 |
116 | which ranks the labels at the specified time according to their expected performance against an average opponent, i.e. an opponent with an average rating.
117 |
118 | Reference
119 | ---------
120 |
121 | Main class
122 | ^^^^^^^^^^
123 | .. autoclass:: melo.Melo
124 |
125 | Training function
126 | """""""""""""""""
127 | .. autofunction:: melo.Melo.fit
128 |
129 | Prediction functions
130 | """"""""""""""""""""
131 | .. autofunction:: melo.Melo.probability
132 |
133 | .. autofunction:: melo.Melo.percentile
134 |
135 | .. autofunction:: melo.Melo.quantile
136 |
137 | .. autofunction:: melo.Melo.mean
138 |
139 | .. autofunction:: melo.Melo.median
140 |
141 | .. autofunction:: melo.Melo.residuals
142 |
143 | .. autofunction:: melo.Melo.quantiles
144 |
145 | .. autofunction:: melo.Melo.rank
146 |
147 | .. autofunction:: melo.Melo.sample
148 |
--------------------------------------------------------------------------------
/docs/plot_tests.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python3
2 |
3 | from collections import OrderedDict
4 | from itertools import combinations
5 | import logging
6 | import os
7 | from pathlib import Path
8 | import warnings
9 |
10 | import matplotlib.pyplot as plt
11 | import numpy as np
12 | from scipy.stats import poisson, skellam
13 |
14 | from melo import Melo
15 |
16 |
17 | # new tableau colors
18 | # https://www.tableau.com/about/blog/2016/7/colors-upgrade-tableau-10-56782
19 | colors = OrderedDict([
20 | ('blue', '#4e79a7'),
21 | ('orange', '#f28e2b'),
22 | ('green', '#59a14f'),
23 | ('red', '#e15759'),
24 | ('cyan', '#76b7b2'),
25 | ('purple', '#b07aa1'),
26 | ('brown', '#9c755f'),
27 | ('yellow', '#edc948'),
28 | ('pink', '#ff9da7'),
29 | ('gray', '#bab0ac')
30 | ])
31 |
32 | default_color = '#404040'
33 | font_size = 18
34 |
35 | plt.rcdefaults()
36 | plt.rcParams.update({
37 | 'figure.figsize': (10, 6.18),
38 | 'figure.dpi': 200,
39 | 'figure.autolayout': True,
40 | 'font.family': 'sans-serif',
41 | 'font.sans-serif': ['Lato'],
42 | 'mathtext.fontset': 'custom',
43 | 'mathtext.cal': 'sans',
44 | 'font.size': font_size,
45 | 'legend.fontsize': font_size,
46 | 'axes.labelsize': font_size,
47 | 'axes.titlesize': font_size,
48 | 'axes.prop_cycle': plt.cycler('color', list(colors.values())),
49 | 'xtick.labelsize': font_size - 2,
50 | 'ytick.labelsize': font_size - 2,
51 | 'lines.linewidth': 1.25,
52 | 'lines.markeredgewidth': .1,
53 | 'patch.linewidth': 1.25,
54 | 'axes.grid': True,
55 | 'axes.axisbelow': True,
56 | 'axes.facecolor': '#eaeaf2',
57 | 'axes.linewidth': 0,
58 | 'grid.linestyle': '-',
59 | 'grid.linewidth': 1,
60 | 'grid.color': '#fcfcfc',
61 | 'savefig.facecolor': '#fcfcfc',
62 | 'xtick.major.size': 0,
63 | 'ytick.major.size': 0,
64 | 'xtick.minor.size': 0,
65 | 'ytick.minor.size': 0,
66 | 'xtick.major.pad': 7,
67 | 'ytick.major.pad': 7,
68 | 'text.color': default_color,
69 | 'axes.edgecolor': default_color,
70 | 'axes.labelcolor': default_color,
71 | 'xtick.color': default_color,
72 | 'ytick.color': default_color,
73 | 'legend.numpoints': 1,
74 | 'legend.scatterpoints': 1,
75 | 'legend.frameon': False,
76 | 'image.interpolation': 'none',
77 | })
78 |
79 | plotdir = Path('_static')
80 | plotdir.mkdir(exist_ok=True)
81 |
82 | plot_functions = {}
83 |
84 |
85 | def plot(f):
86 | """
87 | Plot function decorator. Calls the function, does several generic tasks,
88 | and saves the figure as the function name.
89 | """
90 | def wrapper(*args, **kwargs):
91 | logging.info('generating plot: %s', f.__name__)
92 | f(*args, **kwargs)
93 |
94 | fig = plt.gcf()
95 |
96 | plotfile = plotdir / '{}.png'.format(f.__name__)
97 | fig.savefig(str(plotfile))
98 | logging.info('wrote %s', plotfile)
99 | plt.close(fig)
100 |
101 | plot_functions[f.__name__] = wrapper
102 |
103 | return wrapper
104 |
105 |
106 | def figsize(relwidth=1, aspect=.618, refwidth=10):
107 | """
108 | Return figure dimensions from a relative width (to a reference width) and
109 | aspect ratio (default: 1/golden ratio).
110 | """
111 | width = relwidth * refwidth
112 |
113 | return width, width*aspect
114 |
115 |
116 | def set_tight(fig=None, **kwargs):
117 | """
118 | Set tight_layout with a better default pad.
119 | """
120 | if fig is None:
121 | fig = plt.gcf()
122 |
123 | kwargs.setdefault('pad', .1)
124 | fig.set_tight_layout(kwargs)
125 |
126 |
127 | class League:
128 | """
129 | Create a toy-model league of Poisson random variables.
130 |
131 | """
132 | lambdas = [100, 90, 94, 98, 102, 106, 110]
133 | lambda1, *lambda2_list = lambdas
134 |
135 | def __init__(self, size=1000):
136 |
137 | self.times = np.arange(size).astype('datetime64[s]')
138 | lambdas1, lambdas2 = np.random.choice(self.lambdas, size=(2, size))
139 |
140 | self.spreads = skellam.rvs(mu1=lambdas1, mu2=lambdas2, size=size)
141 | self.totals = poisson.rvs(mu=(lambdas1 + lambdas2), size=size)
142 |
143 | self.labels1 = lambdas1.astype(str)
144 | self.labels2 = lambdas2.astype(str)
145 |
146 |
147 | league = League(10**6)
148 |
149 |
150 | @plot
151 | def quickstart_example():
152 | """
153 | Create time series of comparison data by pairing and
154 | substracting 100 different Poisson distributions
155 |
156 | """
157 | mu_values = np.random.randint(80, 110, 100)
158 | mu1, mu2 = map(np.array, zip(*combinations(mu_values, 2)))
159 | labels1, labels2 = [mu.astype(str) for mu in [mu1, mu2]]
160 | spreads = skellam.rvs(mu1=mu1, mu2=mu2)
161 | times = np.arange(spreads.size).astype('datetime64[s]')
162 |
163 | # MELO class arguments (explained in docs)
164 | lines = np.arange(-59.5, 60.5)
165 | k = .15
166 |
167 | # train the model on the list of comparisons
168 | melo = Melo(lines=lines, k=k)
169 | melo.fit(times, labels1, labels2, spreads)
170 |
171 | # predicted and true (analytic) comparison values
172 | pred_times = np.repeat(melo.last_update, times.size)
173 | pred = melo.mean(pred_times, labels1, labels2)
174 | true = skellam.mean(mu1=mu1, mu2=mu2)
175 |
176 | # plot predicted means versus true means
177 | plt.scatter(pred, true)
178 | plt.plot([-20, 20], [-20, 20], color='k')
179 | plt.xlabel('predicted mean')
180 | plt.ylabel('true mean')
181 |
182 |
183 | @plot
184 | def validate_spreads():
185 | """
186 | Prior spread predictions at every value of the line.
187 |
188 | """
189 | fig, (ax_prior, ax2_post) = plt.subplots(
190 | nrows=2, figsize=figsize(aspect=1.2))
191 |
192 | # train margin-dependent Elo model
193 | melo = Melo(lines=np.arange(-49.5, 50.5), commutes=False, k=1e-4)
194 | melo.fit(league.times, league.labels1, league.labels2, league.spreads)
195 |
196 | # exact prior distribution
197 | outcomes = melo.training_data.value[:, np.newaxis] > melo.lines
198 | sf = np.mean(outcomes, axis=0)
199 | ax_prior.plot(melo.lines, sf, color='k')
200 |
201 | # label names
202 | label1 = str(league.lambda1)
203 | label2_list = [str(lambda2) for lambda2 in league.lambda2_list]
204 |
205 | plot_args = [
206 | (ax_prior, melo.first_update, 'prior'),
207 | (ax2_post, melo.last_update, 'posterior'),
208 | ]
209 |
210 | for ax, time, title in plot_args:
211 | for n, label2 in enumerate(label2_list):
212 |
213 | lines, sf = melo._predict(time, label1, label2)
214 | label = r'$\lambda_2={}$'.format(label2)
215 |
216 | if ax.is_first_row():
217 | ax.plot(lines[n::6], sf[n::6], 'o', zorder=2, label=label)
218 |
219 | if ax.is_last_row():
220 | ax.plot(lines, sf, 'o', zorder=2, label=label)
221 |
222 | sf = skellam.sf(melo.lines, int(label1), int(label2))
223 | ax.plot(melo.lines, sf, color='k')
224 |
225 | leg = ax.legend(title=r'$\lambda_1 = {}$'.format(label1),
226 | handletextpad=.2, loc=1)
227 | leg._legend_box.align = 'right'
228 |
229 | lines = np.floor(lines)
230 | ax.set_xticks(lines[::10])
231 | ax.set_xlim(lines.min(), lines.max())
232 |
233 | if ax.is_last_row():
234 | ax.set_xlabel('line $=$ scored $-$ allowed')
235 |
236 | ax.set_ylabel('probability to cover line')
237 |
238 | ax.annotate(title, xy=(.05, .05),
239 | xycoords='axes fraction', fontsize=24)
240 |
241 | set_tight(h_pad=1)
242 |
243 |
244 | @plot
245 | def validate_totals():
246 | """
247 | Prior spread predictions at every value of the line.
248 |
249 | """
250 | fig, (ax_prior, ax2_post) = plt.subplots(
251 | nrows=2, figsize=figsize(aspect=1.2))
252 |
253 | # train margin-dependent Elo model
254 | melo = Melo(lines=np.arange(149.5, 250.5), commutes=True, k=1e-4)
255 | melo.fit(league.times, league.labels1, league.labels2, league.totals)
256 |
257 | # exact prior distribution
258 | outcomes = melo.training_data.value[:, np.newaxis] > melo.lines
259 | sf = np.mean(outcomes, axis=0)
260 | ax_prior.plot(melo.lines, sf, color='k')
261 |
262 | # label names
263 | label1 = str(league.lambda1)
264 | label2_list = [str(lambda2) for lambda2 in league.lambda2_list]
265 |
266 | plot_args = [
267 | (ax_prior, melo.first_update, 'prior'),
268 | (ax2_post, melo.last_update, 'posterior'),
269 | ]
270 |
271 | for ax, time, title in plot_args:
272 | for n, label2 in enumerate(label2_list):
273 |
274 | lines, sf = melo._predict(time, label1, label2)
275 | label = r'$\lambda_2={}$'.format(label2)
276 |
277 | if ax.is_first_row():
278 | ax.plot(lines[n::6], sf[n::6], 'o', zorder=2, label=label)
279 |
280 | if ax.is_last_row():
281 | ax.plot(lines, sf, 'o', zorder=2, label=label)
282 |
283 | sf = poisson.sf(melo.lines, int(label1) + int(label2))
284 | ax.plot(melo.lines, sf, color='k')
285 |
286 | leg = ax.legend(title=r'$\lambda_1 = {}$'.format(label1),
287 | handletextpad=.2, loc=1)
288 | leg._legend_box.align = 'right'
289 |
290 | lines = np.floor(lines)
291 | ax.set_xticks(lines[::10])
292 | ax.set_xlim(lines.min(), lines.max())
293 |
294 | if ax.is_last_row():
295 | ax.set_xlabel('line $=$ scored $+$ allowed')
296 |
297 | ax.set_ylabel('probability to cover line')
298 |
299 | ax.annotate(title, xy=(.05, .05),
300 | xycoords='axes fraction', fontsize=24)
301 |
302 | set_tight(h_pad=1)
303 |
304 |
305 | @plot
306 | def convergence():
307 | """
308 | Test rating convergence at single value of the line.
309 |
310 | """
311 | fig, axes = plt.subplots(nrows=2, figsize=figsize(aspect=1.2))
312 |
313 | # label names
314 | label1 = str(league.lambda1)
315 | label2_list = [str(lambda2) for lambda2 in league.lambda2_list]
316 |
317 | # point spread and point total subplots
318 | subplots = [
319 | (False, [-0.5, 0.5], league.spreads, 'probability spread > 0.5'),
320 | (True, [200.5], league.totals, 'probability total > 200.5'),
321 | ]
322 |
323 | for ax, (commutes, lines, values, ylabel) in zip(axes, subplots):
324 |
325 | # train margin-dependent Elo model
326 | melo = Melo(lines=lines, commutes=commutes, k=1e-4)
327 | melo.fit(league.times, league.labels1, league.labels2, values)
328 |
329 | line = lines[-1]
330 |
331 | for label2 in label2_list:
332 |
333 | # evaluation times and labels
334 | times = np.arange(league.times.size)[::1000]
335 | labels1 = times.size * [label1]
336 | labels2 = times.size * [label2]
337 |
338 | # observed win probability
339 | prob = melo.probability(times, labels1, labels2, lines=line)
340 | ax.plot(times, prob)
341 |
342 | # true (analytic) win probability
343 | if ax.is_first_row():
344 | prob = skellam.sf(line, int(label1), int(label2))
345 | ax.axhline(prob, color='k')
346 | else:
347 | prob = poisson.sf(line, int(label1) + int(label2))
348 | ax.axhline(prob, color='k')
349 |
350 | # axes labels
351 | if ax.is_last_row():
352 | ax.set_xlabel('Iterations')
353 | ax.set_ylabel(ylabel)
354 |
355 | set_tight(w_pad=.5)
356 |
357 |
358 | def main():
359 | import argparse
360 |
361 | logging.basicConfig(
362 | format='[%(levelname)s][%(module)s] %(message)s',
363 | level=os.getenv('LOGLEVEL', 'info').upper()
364 | )
365 |
366 | parser = argparse.ArgumentParser()
367 | parser.add_argument('plots', nargs='*')
368 | args = parser.parse_args()
369 |
370 | with warnings.catch_warnings():
371 | warnings.filterwarnings("ignore",category=FutureWarning)
372 |
373 | if args.plots:
374 | for i in args.plots:
375 | if i.endswith('.pdf'):
376 | i = i[:-4]
377 | if i in plot_functions:
378 | plot_functions[i]()
379 | else:
380 | print('unknown plot:', i)
381 | else:
382 | for f in plot_functions.values():
383 | f()
384 |
385 |
386 | if __name__ == "__main__":
387 | main()
388 |
--------------------------------------------------------------------------------
/src/melo/melo.py:
--------------------------------------------------------------------------------
1 | # MELO: Margin-dependent Elo ratings and predictions
2 | # Copyright 2019 J. Scott Moreland
3 | # MIT License
4 |
5 | from __future__ import division
6 |
7 | import numpy as np
8 |
9 | from .dist import normal, logistic
10 |
11 |
12 | class Melo(object):
13 | r"""
14 | Margin-dependent Elo (MELO) class constructor
15 |
16 | Parameters
17 | ----------
18 | k : float
19 | Prefactor multiplying each rating update
20 | :math:`\Delta R = k\, (P_\text{obs} - P_\text{pred})`.
21 |
22 | lines : array_like of float, optional
23 | Handicap line or sequence of lines used to construct the vector of
24 | binary comparisons
25 |
26 | :math:`\mathcal{C}(\text{label1}, \text{label2}, \text{value}) \equiv
27 | (\text{value} > \text{lines})`.
28 |
29 | The default setting, lines=0, deploys the traditional
30 | Elo rating system.
31 |
32 | sigma : float, optional
33 | Smearing parameter which gives the observed probability,
34 |
35 | :math:`P_\mathrm{obs} = 1` if value > line else 0,
36 |
37 | a soft edge of width sigma.
38 | A small sigma value helps to regulate and smooth the predicted
39 | probability distributions.
40 |
41 | regress : function, optional
42 | Univariate scalar function regress = f(time) which describes how
43 | ratings should regress to the mean as a function of elapsed time.
44 | When this function value is zero, the rating is unaltered, and when
45 | it is unity, the rating is fully regressed to the mean.
46 | The time units are set by the parameter regress_units (see below).
47 |
48 | regress_unit : string, optional
49 | Unit of elapsed time for the regress function.
50 | Options are: year (default), month, week, day, hour, minute, second,
51 | millisecond, microsecond, nanosecond, picosecond, femtosecond, and
52 | attosecond.
53 |
54 | dist : string, optional
55 | Probability distribution, "normal" (default) or "logistic", which
56 | converts rating differences into probabilities:
57 |
58 | :math:`P(\text{value} > \text{line}) =
59 | \text{dist.cdf}(\Delta R(\text{line}))`
60 |
61 | commutes : bool, optional
62 | If this is set to True, the comparison values are assumed to be
63 | symmetric under label interchange.
64 | Otherwise the values are assumed to be *anti*-symmetric under label
65 | interchange.
66 |
67 | For example, point-spreads should use commutes=False and point-totals
68 | commutes=True.
69 |
70 | """
71 | seconds = {
72 | 'year': 3.154e7,
73 | 'month': 2.628e6,
74 | 'week': 604800.,
75 | 'day': 86400.,
76 | 'hour': 3600.,
77 | 'minute': 60.,
78 | 'second': 1.,
79 | 'millisecond': 1e-3,
80 | 'microsecond': 1e-6,
81 | 'nanosecond': 1e-9,
82 | 'picosecond': 1e-12,
83 | 'femtosecond': 1e-15,
84 | 'attosecond': 1e-18,
85 | }
86 |
87 | def __init__(self, k, lines=0, sigma=0, regress=None,
88 | regress_unit='year', dist='normal', commutes=False):
89 |
90 | if k < 0 or not np.isscalar(k):
91 | raise ValueError('k must be a non-negative real number')
92 |
93 | self.k = k
94 |
95 | self.lines = np.array(lines, dtype='float', ndmin=1)
96 |
97 | if sigma < 0 or not np.isscalar(sigma):
98 | raise ValueError('sigma must be a non-negative real number')
99 |
100 | self.sigma = np.float(max(sigma, 1e-12))
101 |
102 | self.regress = self.default_regress if regress is None else regress
103 |
104 | if not callable(self.regress):
105 | raise ValueError('regress must be univariate scalar function')
106 |
107 | if regress_unit not in self.seconds.keys():
108 | raise ValueError('regress_unit must be valid time unit (see docs)')
109 |
110 | self.seconds_per_period = self.seconds[regress_unit]
111 |
112 | if dist == 'normal':
113 | self.dist = normal
114 | elif dist == 'logistic':
115 | self.dist = logistic
116 | else:
117 | raise ValueError('no such distribution')
118 |
119 | self.commutes = commutes
120 |
121 | if commutes is True:
122 | self.conjugate = self.identity
123 | else:
124 | if all(self.lines != -self.lines[::-1]):
125 | raise ValueError(
126 | "lines must be symmetric when commutes is False"
127 | )
128 | self.conjugate = self.reverse_neg
129 |
130 | self.first_update = None
131 | self.last_update = None
132 | self.labels = None
133 | self.training_data = None
134 | self.prior_bias = None
135 | self.prior_rating = None
136 | self.ratings_history = None
137 |
138 | @staticmethod
139 | def identity(x):
140 | """
141 | Identity function
142 |
143 | """
144 | return x
145 |
146 | @staticmethod
147 | def reverse_neg(x):
148 | """
149 | Negate reversed list
150 |
151 | """
152 | return -x[::-1]
153 |
154 | @staticmethod
155 | def default_regress(x):
156 | """
157 | Default regression function
158 |
159 | """
160 | return 0
161 |
162 | def _read_training_data(self, times, labels1, labels2, values, biases):
163 | """
164 | Internal function: Read training inputs and initialize class variables
165 |
166 | Parameters
167 | ----------
168 | times : array_like of np.datetime64
169 | List of datetimes.
170 |
171 | labels1 : array_like of string
172 | List of first entity labels.
173 |
174 | labels2 : array_like of string
175 | List of second entity labels.
176 |
177 | values : array_like of float
178 | List of comparison values.
179 |
180 | biases : array_like of float
181 | Single bias number or list of bias numbers which match the
182 | comparison inputs.
183 | Default is 0, in which case no bias is used.
184 |
185 | """
186 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
187 | labels1 = np.array(labels1, dtype='str', ndmin=1)
188 | labels2 = np.array(labels2, dtype='str', ndmin=1)
189 | values = np.array(values, dtype='float', ndmin=1)
190 |
191 | if np.isscalar(biases):
192 | biases = np.full_like(times, biases, dtype='float')
193 | else:
194 | biases = np.array(biases, dtype='float', ndmin=1)
195 |
196 | self.first_update = times.min()
197 | self.last_update = times.max()
198 | self.labels = np.union1d(labels1, labels2)
199 |
200 | self.training_data = np.sort(
201 | np.rec.fromarrays([
202 | times,
203 | labels1,
204 | labels2,
205 | values,
206 | biases,
207 | ], names=(
208 | 'time',
209 | 'label1',
210 | 'label2',
211 | 'value',
212 | 'bias',
213 | )), order='time', axis=0)
214 |
215 | prior_prob = np.mean(values[:, np.newaxis] - self.lines > 0, axis=0)
216 |
217 | TINY = 1e-6
218 | prob = np.clip(prior_prob, TINY, 1 - TINY)
219 | rating_diff = -self.dist.isf(prob)
220 |
221 | self.prior_bias = np.median(rating_diff) if not self.commutes else 0
222 |
223 | if self.prior_rating is None:
224 | self.prior_rating = {
225 | label: 0.5*(rating_diff - self.prior_bias)
226 | for label in np.append(self.labels, 'average')
227 | }
228 |
229 | def evolve(self, rating, mean_rating, time_delta):
230 | """
231 | Evolve rating to a future time and regress to the mean.
232 |
233 | Parameters
234 | ----------
235 | rating : ndarray of float
236 | Array of label ratings.
237 |
238 | time_delta : np.timedelta64
239 | Elapsed time since the label's ratings were last updated.
240 |
241 | Returns
242 | -------
243 | rating : ndarray of float
244 | Label ratings after regression to the mean.
245 |
246 | """
247 | elapsed_seconds = time_delta / np.timedelta64(1, 's')
248 | elapsed_periods = elapsed_seconds / self.seconds_per_period
249 | regress = self.regress(elapsed_periods)
250 |
251 | return rating + regress*(mean_rating - rating)
252 |
253 | def query_rating(self, time, label):
254 | """
255 | Query label's rating at the specified 'time' accounting
256 | for rating regression.
257 |
258 | Parameters
259 | ----------
260 | time : np.datetime64
261 | Comparison datetime
262 |
263 | label : string
264 | Comparison entity label. If label == average, then the average
265 | rating of all labels is returned.
266 |
267 | Returns
268 | -------
269 | rating : ndarray of float
270 | Applies the user specified rating regression function to regress
271 | ratings to the mean as necessary and returns the ratings for the
272 | given label at the specified time.
273 |
274 | """
275 | time = np.datetime64(time, 's')
276 |
277 | if label.lower() == 'average':
278 | return self.prior_rating[label]
279 | elif label not in self.ratings_history:
280 | raise ValueError("no such label in comparisons")
281 |
282 | try:
283 | last_update = self.ratings_history[label][
284 | np.nonzero(self.ratings_history[label].time < time)
285 | ][-1]
286 | return self.evolve(
287 | last_update.rating,
288 | self.prior_rating[label],
289 | time - last_update.time,
290 | )
291 | except IndexError:
292 | return self.prior_rating[label]
293 |
294 | def fit(self, times, labels1, labels2, values, biases=0):
295 | """
296 | This function is used to calibrate the model on the training inputs.
297 | It computes and records each label's Elo ratings at the line(s) given
298 | in the class constructor.
299 | The function returns the predictions' total cross entropy loss.
300 |
301 | Parameters
302 | ----------
303 | times : array_like of np.datetime64
304 | List of datetimes.
305 |
306 | labels1 : array_like of string
307 | List of first entity labels.
308 |
309 | labels2 : array_like of string
310 | List of second entity labels.
311 |
312 | biases : array_like of float, optional
313 | Single bias number or list of bias numbers which match the
314 | comparison inputs.
315 | Default is 0, in which case no bias is used.
316 |
317 | Returns
318 | -------
319 | loss : float
320 | Cross entropy loss for the model predictions.
321 |
322 | """
323 | # read training inputs and initialize class variables
324 | self._read_training_data(times, labels1, labels2, values, biases)
325 |
326 | # initialize ratings history for each label
327 | self.ratings_history = {label: [] for label in self.labels}
328 |
329 | # temporary variable to store each label's last rating
330 | prev_update = {
331 | label: {
332 | 'time': self.first_update,
333 | 'rating': self.prior_rating[label],
334 | } for label in self.labels
335 | }
336 |
337 | # record loss for every prediction
338 | loss_array = np.zeros(self.training_data.size)
339 |
340 | # loop over all binary comparisons
341 | for step, (time, label1, label2, value, bias) \
342 | in enumerate(self.training_data):
343 |
344 | # query ratings and evolve to the current time
345 | rating1, rating2 = [
346 | self.evolve(
347 | prev_update[label]['rating'],
348 | self.prior_rating[label],
349 | time - prev_update[label]['time'],
350 | )
351 | for label in [label1, label2]
352 | ]
353 |
354 | # expected and observed comparison outcomes
355 | total_bias = self.prior_bias + bias
356 | rating_diff = rating1 + self.conjugate(rating2) + total_bias
357 | obs = self.dist.sf(self.lines, loc=value, scale=self.sigma)
358 | pred = self.dist.cdf(rating_diff)
359 |
360 | # cross entropy loss
361 | loss_array[step] = -(
362 | obs*np.log(pred) + (1 - obs)*np.log(1 - pred)
363 | ).sum()
364 |
365 | # update current ratings
366 | rating_change = self.k * (obs - pred)
367 | rating1 += rating_change
368 | rating2 += self.conjugate(rating_change)
369 |
370 | # record current ratings
371 | for label, rating in [(label1, rating1), (label2, rating2)]:
372 | self.ratings_history[label].append((time, rating))
373 | prev_update[label] = {'time': time, 'rating': rating}
374 |
375 | # convert ratings history to a structured rec.array
376 | for label in self.ratings_history.keys():
377 | self.ratings_history[label] = np.rec.array(
378 | self.ratings_history[label], dtype=[
379 | ('time', 'datetime64[s]'),
380 | ('rating', 'float', self.lines.size)
381 | ]
382 | )
383 |
384 | # return cross entropy loss for multi-class classifier
385 | loss_array /= self.lines.size
386 | return loss_array
387 |
388 | def _predict(self, time, label1, label2, bias=0):
389 | """
390 | Internal function: Predict the survival function probability
391 | distribution that a comparison between label1 and label2 covers
392 | each value of the line.
393 |
394 | Parameters
395 | ----------
396 | time : np.datetime64
397 | Comparison datetime.
398 |
399 | label1 : string
400 | Comparison first entity label.
401 |
402 | label2 : string
403 | Comparison second entity label.
404 |
405 | bias : float, optional
406 | Bias number which adds a constant offset to the ratings.
407 | Positive bias factors favor label1.
408 | Default is 0, i.e. no bias.
409 |
410 | """
411 | rating1 = self.query_rating(time, label1)
412 | rating2 = self.query_rating(time, label2)
413 |
414 | total_bias = self.prior_bias + bias
415 | rating_diff = rating1 + self.conjugate(rating2) + total_bias
416 |
417 | return self.lines, self.dist.cdf(rating_diff)
418 |
419 | def probability(self, times, labels1, labels2, biases=0, lines=0):
420 | r"""
421 | Predict the survival function probability
422 | .. math:: P(\text{value} > \text{lines})
423 | for the specified comparison(s).
424 |
425 | Parameters
426 | ----------
427 | times : array_like of np.datetime64
428 | List of datetimes.
429 |
430 | labels1 : array_like of string
431 | List of first entity labels.
432 |
433 | labels2 : array_like of string
434 | List of second entity labels.
435 |
436 | biases : array_like of float, optional
437 | Single bias number or list of bias numbers which match the
438 | comparison inputs.
439 | Default is 0, in which case no bias is used.
440 |
441 | lines : array_like of float, optional
442 | Line or sequence of lines used to estimate the comparison
443 | distribution.
444 | Default is lines=0, in which case the model predicts the
445 | probability that value > 0.
446 |
447 | Returns
448 | -------
449 | probability : scalar or array_like of float
450 | If a single comparison is given and a single line is specified,
451 | this function returns a scalar.
452 | If multiple comparisons or multiple lines are given, this function
453 | returns an ndarray.
454 |
455 | """
456 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
457 | labels1 = np.array(labels1, dtype='str', ndmin=1)
458 | labels2 = np.array(labels2, dtype='str', ndmin=1)
459 |
460 | if np.isscalar(biases):
461 | biases = np.full_like(times, biases, dtype='float')
462 | else:
463 | biases = np.array(biases, dtype='float', ndmin=1)
464 |
465 | shape = (times.size, 1)
466 | lines_array = np.ones(shape) * np.array(lines, dtype='float', ndmin=1)
467 |
468 | probabilities = []
469 |
470 | for time, label1, label2, bias, lines in zip(
471 | times, labels1, labels2, biases, lines_array):
472 |
473 | predict = self._predict(time, label1, label2, bias=bias)
474 |
475 | probabilities.append(np.interp(lines, *predict))
476 |
477 | return np.squeeze(probabilities)
478 |
479 | def percentile(self, times, labels1, labels2, biases=0, p=50):
480 | """
481 | Predict the p-th percentile for the specified comparison(s).
482 |
483 | Parameters
484 | -----------
485 | times : array_like of np.datetime64
486 | List of datetimes.
487 |
488 | labels1 : array_like of string
489 | List of first entity labels.
490 |
491 | labels2 : array_like of string
492 | List of second entity labels.
493 |
494 | biases : array_like of float, optional
495 | Single bias number or list of bias numbers which match the
496 | comparison inputs.
497 | Default is 0, in which case no bias is used.
498 |
499 | p : array_like of float, optional
500 | Percentile or sequence of percentiles to compute, which must be
501 | between 0 and 100 inclusive.
502 | Default is p=50, which computes the median.
503 |
504 | Returns
505 | -------
506 | percentile : scalar or ndarray of float
507 | If one comparison is given, and p is a single percentile,
508 | then the result is a scalar.
509 | If multiple comparisons or multiple percentiles are given, the
510 | result is an ndarray.
511 |
512 | """
513 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
514 | labels1 = np.array(labels1, dtype='str', ndmin=1)
515 | labels2 = np.array(labels2, dtype='str', ndmin=1)
516 |
517 | if np.isscalar(biases):
518 | biases = np.full_like(times, biases, dtype='float')
519 | else:
520 | biases = np.array(biases, dtype='float', ndmin=1)
521 |
522 | p = np.true_divide(p, 100.0)
523 |
524 | if np.count_nonzero(p < 0.0) or np.count_nonzero(p > 1.0):
525 | raise ValueError("percentiles must be in the range [0, 100]")
526 |
527 | percentiles = []
528 |
529 | for time, label1, label2, bias in zip(times, labels1, labels2, biases):
530 |
531 | x, F = self._predict(time, label1, label2, bias=bias)
532 |
533 | percentiles.append(np.interp(p, np.sort(1 - F), x))
534 |
535 | return np.squeeze(percentiles)
536 |
537 | def quantile(self, times, labels1, labels2, biases=0, q=.5):
538 | """
539 | Predict the q-th quantile for the specified comparison(s).
540 |
541 | Parameters
542 | -----------
543 | times : array_like of np.datetime64
544 | List of datetimes.
545 |
546 | labels1 : array_like of string
547 | List of first entity labels.
548 |
549 | labels2 : array_like of string
550 | List of second entity labels.
551 |
552 | biases : array_like of float, optional
553 | Single bias number or list of bias numbers which match the
554 | comparison inputs.
555 | Default is 0, in which case no bias is used.
556 |
557 | q : array_like of float, optional
558 | Quantile or sequence of quantiles to compute, which must be
559 | between 0 and 1 inclusive.
560 | Default is q=0.5, which computes the median.
561 |
562 | Returns
563 | -------
564 | quantile : scalar or ndarray of float
565 | If one comparison is given, and q is a single quantiles,
566 | then the result is a scalar.
567 | If multiple comparisons or multiple quantiles are given, the
568 | result is an ndarray.
569 |
570 | """
571 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
572 | labels1 = np.array(labels1, dtype='str', ndmin=1)
573 | labels2 = np.array(labels2, dtype='str', ndmin=1)
574 |
575 | if np.isscalar(biases):
576 | biases = np.full_like(times, biases, dtype='float')
577 | else:
578 | biases = np.array(biases, dtype='float', ndmin=1)
579 |
580 | q = np.asarray(q)
581 |
582 | if np.count_nonzero(q < 0.0) or np.count_nonzero(q > 1.0):
583 | raise ValueError("quantiles must be in the range [0, 1]")
584 |
585 | quantiles = []
586 |
587 | for time, label1, label2, bias in zip(times, labels1, labels2, biases):
588 |
589 | x, F = self._predict(time, label1, label2, bias=bias)
590 |
591 | quantiles.append(np.interp(q, np.sort(1 - F), x))
592 |
593 | return np.squeeze(quantiles)
594 |
595 | def mean(self, times, labels1, labels2, biases=0):
596 | """
597 | Predict the mean for the specified comparison(s).
598 |
599 | Parameters
600 | -----------
601 | times : array_like of np.datetime64
602 | List of datetimes.
603 |
604 | labels1 : array_like of string
605 | List of first entity labels.
606 |
607 | labels2 : array_like of string
608 | List of second entity labels.
609 |
610 | biases : array_like of float, optional
611 | Single bias number or list of bias numbers which match the
612 | comparison inputs.
613 | Default is 0, in which case no bias is used.
614 |
615 | Returns
616 | -------
617 | mean : scalar or ndarray of float
618 | If one comparison is given, then the result is a scalar.
619 | If multiple comparisons are given, then the result is an ndarray.
620 |
621 | """
622 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
623 | labels1 = np.array(labels1, dtype='str', ndmin=1)
624 | labels2 = np.array(labels2, dtype='str', ndmin=1)
625 |
626 | if np.isscalar(biases):
627 | biases = np.full_like(times, biases, dtype='float')
628 | else:
629 | biases = np.array(biases, dtype='float', ndmin=1)
630 |
631 | means = []
632 |
633 | for time, label1, label2, bias in zip(times, labels1, labels2, biases):
634 | x, F = self._predict(time, label1, label2, bias=bias)
635 | mean = np.trapz(F, x) - (x[-1]*F[-1] - x[0]*F[0])
636 | means.append(np.asscalar(mean))
637 |
638 | return np.squeeze(means)
639 |
640 | def median(self, times, labels1, labels2, biases=0):
641 | """
642 | Predict the median for the specified comparison(s).
643 |
644 | Parameters
645 | -----------
646 | times : array_like of np.datetime64
647 | List of datetimes.
648 |
649 | labels1 : array_like of string
650 | List of first entity labels.
651 |
652 | labels2 : array_like of string
653 | List of second entity labels.
654 |
655 | biases : array_like of float, optional
656 | Single bias number or list of bias numbers which match the
657 | comparison inputs.
658 | Default is 0, in which case no bias is used.
659 |
660 | Returns
661 | -------
662 | median : scalar or ndarray of float
663 | If one comparison is given, then the result is a scalar.
664 | If multiple comparisons are given, then the result is an ndarray.
665 |
666 | """
667 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
668 | labels1 = np.array(labels1, dtype='str', ndmin=1)
669 | labels2 = np.array(labels2, dtype='str', ndmin=1)
670 |
671 | if np.isscalar(biases):
672 | biases = np.full_like(times, biases, dtype='float')
673 | else:
674 | biases = np.array(biases, dtype='float', ndmin=1)
675 |
676 | return self.quantile(times, labels1, labels2, biases=biases, q=.5)
677 |
678 | def residuals(self, statistic='mean', standardize=False):
679 | """
680 | Prediction residuals (or Z-scores if standardize is True) for all
681 | comparisons in the training data.
682 | The Z-scores should sample a unit normal distribution.
683 |
684 | Parameters
685 | ----------
686 | statistic : string, optional
687 | Type of prediction statistic.
688 | Options are 'mean' (default) or 'median'.
689 |
690 | standardize : bool, optional
691 | If standardize is True, divides prediction residuals by their
692 | one-sigma prediction uncertainty.
693 | Default value is False.
694 |
695 | Returns
696 | -------
697 | residuals : ndarray of float
698 | The residuals for each comparison in the training data.
699 | The residuals are time ordered, and may not appear in the same
700 | order as originally given.
701 |
702 | """
703 | if statistic == 'mean':
704 | func = self.mean
705 | elif statistic == 'median':
706 | func = self.median
707 | else:
708 | raise ValueError("predict options are 'mean' and 'median'")
709 |
710 | predicted = func(
711 | self.training_data.time,
712 | self.training_data.label1,
713 | self.training_data.label2,
714 | self.training_data.bias,
715 | )
716 |
717 | observed = self.training_data.value
718 |
719 | residuals = observed - predicted
720 |
721 | if standardize is True:
722 |
723 | qlo, qhi = self.quantile(
724 | self.training_data.time,
725 | self.training_data.label1,
726 | self.training_data.label2,
727 | self.training_data.bias,
728 | q=[.159, .841],
729 | ).T
730 |
731 | residuals /= .5*abs(qhi - qlo)
732 |
733 | return residuals
734 |
735 | def quantiles(self):
736 | """
737 | Prediction quantiles for all comparisons in the training data.
738 | The quantiles should sample a uniform distribution from 0 to 1.
739 |
740 | Returns
741 | -------
742 | quantiles : ndarray of float
743 | The quantiles for each comparison in the training data.
744 | The quantiles are time ordered, and may not appear in the same
745 | order as originally given.
746 |
747 | """
748 | quantiles = self.probability(
749 | self.training_data.time,
750 | self.training_data.label1,
751 | self.training_data.label2,
752 | self.training_data.bias,
753 | lines=self.training_data.value[:, np.newaxis],
754 | )
755 |
756 | return quantiles
757 |
758 | def rank(self, time, statistic='mean'):
759 | """
760 | Ranks labels by comparing each label to the average label using
761 | the specified summary statistic.
762 |
763 | Parameters
764 | ----------
765 | time : np.datetime64
766 | The time at which the ranking should be computed.
767 |
768 | statistic : string, optional
769 | Determines the binary comparison ranking statistic.
770 | Options are 'mean' (default), 'median', or 'win'.
771 |
772 | Returns
773 | -------
774 | label rankings : list of tuples
775 | Returns a rank sorted list of (label, rank) pairs, where rank is
776 | the comparison value of the specified summary statistic.
777 |
778 | """
779 | if statistic == 'mean':
780 | func = self.mean
781 | elif statistic == 'median':
782 | func = self.median
783 | elif statistic == 'win':
784 | func = self.probability
785 | else:
786 | raise ValueError('no such order parameter')
787 |
788 | remove_bias = -self.prior_bias
789 |
790 | ranked_list = [
791 | (label, np.float(func(time, label, 'average', biases=remove_bias)))
792 | for label in self.labels
793 | ]
794 |
795 | return sorted(ranked_list, key=lambda v: v[1], reverse=True)
796 |
797 | def sample(self, times, labels1, labels2, biases=0, size=100):
798 | """
799 | Draw random samples from the predicted comparison probability
800 | distribution.
801 |
802 | Parameters
803 | ----------
804 | times : array_like of np.datetime64
805 | List of datetimes.
806 |
807 | labels1 : array_like of string
808 | List of first entity labels.
809 |
810 | labels2 : array_like of string
811 | List of second entity labels.
812 |
813 | biases : array_like of float, optional
814 | Single bias number or list of bias numbers which match the
815 | comparison inputs.
816 | Default is 0, in which case no bias is used.
817 |
818 | size : int, optional
819 | Number of samples to be drawn.
820 | Default is 1, in which case a single value is returned.
821 |
822 | """
823 | times = np.array(times, dtype='datetime64[s]', ndmin=1)
824 | labels1 = np.array(labels1, dtype='str', ndmin=1)
825 | labels2 = np.array(labels2, dtype='str', ndmin=1)
826 |
827 | if np.isscalar(biases):
828 | biases = np.full_like(times, biases, dtype='float')
829 | else:
830 | biases = np.array(biases, dtype='float', ndmin=1)
831 |
832 | if size < 1 or not isinstance(size, int):
833 | raise ValueError("sample size must be a positive integer")
834 |
835 | samples = []
836 |
837 | for time, label1, label2, bias in zip(times, labels1, labels2, biases):
838 |
839 | x, F = self._predict(time, label1, label2, bias=bias)
840 | rand = np.random.rand(size)
841 |
842 | samples.append(np.interp(rand, np.sort(1 - F), x))
843 |
844 | return np.squeeze(samples)
845 |
--------------------------------------------------------------------------------
/src/melo/nfl.dat:
--------------------------------------------------------------------------------
1 | # date, home, score, away, score
2 | 2009-09-10 PIT 13 TEN 10
3 | 2009-09-13 ATL 19 MIA 7
4 | 2009-09-13 BAL 38 KC 24
5 | 2009-09-13 CAR 10 PHI 38
6 | 2009-09-13 CIN 7 DEN 12
7 | 2009-09-13 CLE 20 MIN 34
8 | 2009-09-13 HOU 7 NYJ 24
9 | 2009-09-13 IND 14 JAC 12
10 | 2009-09-13 NO 45 DET 27
11 | 2009-09-13 TB 21 DAL 34
12 | 2009-09-13 ARI 16 SF 20
13 | 2009-09-13 NYG 23 WAS 17
14 | 2009-09-13 SEA 28 LAR 0
15 | 2009-09-13 GB 21 CHI 15
16 | 2009-09-14 NE 25 BUF 24
17 | 2009-09-14 OAK 20 LAC 24
18 | 2009-09-20 ATL 28 CAR 20
19 | 2009-09-20 DET 13 MIN 27
20 | 2009-09-20 GB 24 CIN 31
21 | 2009-09-20 JAC 17 ARI 31
22 | 2009-09-20 KC 10 OAK 13
23 | 2009-09-20 NYJ 16 NE 9
24 | 2009-09-20 PHI 22 NO 48
25 | 2009-09-20 TEN 31 HOU 34
26 | 2009-09-20 WAS 9 LAR 7
27 | 2009-09-20 BUF 33 TB 20
28 | 2009-09-20 SF 23 SEA 10
29 | 2009-09-20 CHI 17 PIT 14
30 | 2009-09-20 DEN 27 CLE 6
31 | 2009-09-20 LAC 26 BAL 31
32 | 2009-09-20 DAL 31 NYG 33
33 | 2009-09-21 MIA 23 IND 27
34 | 2009-09-27 BAL 34 CLE 3
35 | 2009-09-27 DET 19 WAS 14
36 | 2009-09-27 HOU 24 JAC 31
37 | 2009-09-27 MIN 27 SF 24
38 | 2009-09-27 NE 26 ATL 10
39 | 2009-09-27 PHI 34 KC 14
40 | 2009-09-27 LAR 17 GB 36
41 | 2009-09-27 TB 0 NYG 24
42 | 2009-09-27 NYJ 24 TEN 17
43 | 2009-09-27 BUF 7 NO 27
44 | 2009-09-27 SEA 19 CHI 25
45 | 2009-09-27 CIN 23 PIT 20
46 | 2009-09-27 OAK 3 DEN 23
47 | 2009-09-27 LAC 23 MIA 13
48 | 2009-09-27 ARI 10 IND 31
49 | 2009-09-28 DAL 21 CAR 7
50 | 2009-10-04 CHI 48 DET 24
51 | 2009-10-04 CLE 20 CIN 23
52 | 2009-10-04 HOU 29 OAK 6
53 | 2009-10-04 IND 34 SEA 17
54 | 2009-10-04 JAC 37 TEN 17
55 | 2009-10-04 KC 16 NYG 27
56 | 2009-10-04 NE 27 BAL 21
57 | 2009-10-04 WAS 16 TB 13
58 | 2009-10-04 MIA 38 BUF 10
59 | 2009-10-04 NO 24 NYJ 10
60 | 2009-10-04 DEN 17 DAL 10
61 | 2009-10-04 SF 35 LAR 0
62 | 2009-10-04 PIT 38 LAC 28
63 | 2009-10-05 MIN 30 GB 23
64 | 2009-10-11 BAL 14 CIN 17
65 | 2009-10-11 BUF 3 CLE 6
66 | 2009-10-11 CAR 20 WAS 17
67 | 2009-10-11 DET 20 PIT 28
68 | 2009-10-11 KC 20 DAL 26
69 | 2009-10-11 NYG 44 OAK 7
70 | 2009-10-11 PHI 33 TB 14
71 | 2009-10-11 LAR 10 MIN 38
72 | 2009-10-11 SF 10 ATL 45
73 | 2009-10-11 ARI 28 HOU 21
74 | 2009-10-11 DEN 20 NE 17
75 | 2009-10-11 SEA 41 JAC 0
76 | 2009-10-11 TEN 9 IND 31
77 | 2009-10-12 MIA 31 NYJ 27
78 | 2009-10-18 CIN 17 HOU 28
79 | 2009-10-18 GB 26 DET 0
80 | 2009-10-18 JAC 23 LAR 20
81 | 2009-10-18 MIN 33 BAL 31
82 | 2009-10-18 NO 48 NYG 27
83 | 2009-10-18 PIT 27 CLE 14
84 | 2009-10-18 TB 21 CAR 28
85 | 2009-10-18 WAS 6 KC 14
86 | 2009-10-18 OAK 13 PHI 9
87 | 2009-10-18 SEA 3 ARI 27
88 | 2009-10-18 NE 59 TEN 0
89 | 2009-10-18 NYJ 13 BUF 16
90 | 2009-10-18 ATL 21 CHI 14
91 | 2009-10-19 LAC 23 DEN 34
92 | 2009-10-25 CLE 3 GB 31
93 | 2009-10-25 HOU 24 SF 21
94 | 2009-10-25 KC 7 LAC 37
95 | 2009-10-25 PIT 27 MIN 17
96 | 2009-10-25 LAR 6 IND 42
97 | 2009-10-25 TB 7 NE 35
98 | 2009-10-25 CAR 9 BUF 20
99 | 2009-10-25 OAK 0 NYJ 38
100 | 2009-10-25 CIN 45 CHI 10
101 | 2009-10-25 DAL 37 ATL 21
102 | 2009-10-25 MIA 34 NO 46
103 | 2009-10-25 NYG 17 ARI 24
104 | 2009-10-26 WAS 17 PHI 27
105 | 2009-11-01 BAL 30 DEN 7
106 | 2009-11-01 BUF 10 HOU 31
107 | 2009-11-01 CHI 30 CLE 6
108 | 2009-11-01 DAL 38 SEA 17
109 | 2009-11-01 DET 10 LAR 17
110 | 2009-11-01 IND 18 SF 14
111 | 2009-11-01 NYJ 25 MIA 30
112 | 2009-11-01 PHI 40 NYG 17
113 | 2009-11-01 LAC 24 OAK 16
114 | 2009-11-01 TEN 30 JAC 13
115 | 2009-11-01 GB 26 MIN 38
116 | 2009-11-01 ARI 21 CAR 34
117 | 2009-11-02 NO 35 ATL 27
118 | 2009-11-08 ATL 31 WAS 17
119 | 2009-11-08 CHI 21 ARI 41
120 | 2009-11-08 CIN 17 BAL 7
121 | 2009-11-08 IND 20 HOU 17
122 | 2009-11-08 JAC 24 KC 21
123 | 2009-11-08 NE 27 MIA 17
124 | 2009-11-08 TB 38 GB 28
125 | 2009-11-08 NO 30 CAR 20
126 | 2009-11-08 SEA 32 DET 20
127 | 2009-11-08 NYG 20 LAC 21
128 | 2009-11-08 SF 27 TEN 34
129 | 2009-11-08 PHI 16 DAL 20
130 | 2009-11-09 DEN 10 PIT 28
131 | 2009-11-12 SF 10 CHI 6
132 | 2009-11-15 CAR 28 ATL 19
133 | 2009-11-15 MIA 25 TB 23
134 | 2009-11-15 MIN 27 DET 10
135 | 2009-11-15 NYJ 22 JAC 24
136 | 2009-11-15 PIT 12 CIN 18
137 | 2009-11-15 LAR 23 NO 28
138 | 2009-11-15 TEN 41 BUF 17
139 | 2009-11-15 WAS 27 DEN 17
140 | 2009-11-15 OAK 10 KC 16
141 | 2009-11-15 ARI 31 SEA 20
142 | 2009-11-15 GB 17 DAL 7
143 | 2009-11-15 LAC 31 PHI 23
144 | 2009-11-15 IND 35 NE 34
145 | 2009-11-16 CLE 0 BAL 16
146 | 2009-11-19 CAR 17 MIA 24
147 | 2009-11-22 BAL 15 IND 17
148 | 2009-11-22 DAL 7 WAS 6
149 | 2009-11-22 DET 38 CLE 37
150 | 2009-11-22 GB 30 SF 24
151 | 2009-11-22 JAC 18 BUF 15
152 | 2009-11-22 KC 27 PIT 24
153 | 2009-11-22 MIN 35 SEA 9
154 | 2009-11-22 NYG 34 ATL 31
155 | 2009-11-22 TB 7 NO 38
156 | 2009-11-22 LAR 13 ARI 21
157 | 2009-11-22 DEN 3 LAC 32
158 | 2009-11-22 NE 31 NYJ 14
159 | 2009-11-22 OAK 20 CIN 17
160 | 2009-11-22 CHI 20 PHI 24
161 | 2009-11-23 HOU 17 TEN 20
162 | 2009-11-26 DET 12 GB 34
163 | 2009-11-26 DAL 24 OAK 7
164 | 2009-11-26 DEN 26 NYG 6
165 | 2009-11-29 ATL 20 TB 17
166 | 2009-11-29 BUF 31 MIA 14
167 | 2009-11-29 CIN 16 CLE 7
168 | 2009-11-29 HOU 27 IND 35
169 | 2009-11-29 NYJ 17 CAR 6
170 | 2009-11-29 PHI 27 WAS 24
171 | 2009-11-29 LAR 17 SEA 27
172 | 2009-11-29 LAC 43 KC 14
173 | 2009-11-29 SF 20 JAC 3
174 | 2009-11-29 MIN 36 CHI 10
175 | 2009-11-29 TEN 20 ARI 17
176 | 2009-11-29 BAL 20 PIT 17
177 | 2009-11-30 NO 38 NE 17
178 | 2009-12-03 BUF 13 NYJ 19
179 | 2009-12-06 ATL 7 PHI 34
180 | 2009-12-06 CAR 16 TB 6
181 | 2009-12-06 CHI 17 LAR 9
182 | 2009-12-06 CIN 23 DET 13
183 | 2009-12-06 IND 27 TEN 17
184 | 2009-12-06 JAC 23 HOU 18
185 | 2009-12-06 KC 13 DEN 44
186 | 2009-12-06 PIT 24 OAK 27
187 | 2009-12-06 WAS 30 NO 33
188 | 2009-12-06 MIA 22 NE 21
189 | 2009-12-06 CLE 23 LAC 30
190 | 2009-12-06 NYG 31 DAL 24
191 | 2009-12-06 SEA 20 SF 17
192 | 2009-12-06 ARI 30 MIN 17
193 | 2009-12-07 GB 27 BAL 14
194 | 2009-12-10 CLE 13 PIT 6
195 | 2009-12-13 ATL 23 NO 26
196 | 2009-12-13 BAL 48 DET 3
197 | 2009-12-13 CHI 14 GB 21
198 | 2009-12-13 HOU 34 SEA 7
199 | 2009-12-13 IND 28 DEN 16
200 | 2009-12-13 JAC 10 MIA 14
201 | 2009-12-13 KC 10 BUF 16
202 | 2009-12-13 MIN 30 CIN 10
203 | 2009-12-13 NE 20 CAR 10
204 | 2009-12-13 TB 3 NYJ 26
205 | 2009-12-13 TEN 47 LAR 7
206 | 2009-12-13 OAK 13 WAS 34
207 | 2009-12-13 DAL 17 LAC 20
208 | 2009-12-13 NYG 38 PHI 45
209 | 2009-12-14 SF 24 ARI 9
210 | 2009-12-17 JAC 31 IND 35
211 | 2009-12-19 NO 17 DAL 24
212 | 2009-12-20 BUF 10 NE 17
213 | 2009-12-20 DET 24 ARI 31
214 | 2009-12-20 KC 34 CLE 41
215 | 2009-12-20 NYJ 7 ATL 10
216 | 2009-12-20 LAR 13 HOU 16
217 | 2009-12-20 TEN 27 MIA 24
218 | 2009-12-20 DEN 19 OAK 20
219 | 2009-12-20 LAC 27 CIN 24
220 | 2009-12-20 BAL 31 CHI 7
221 | 2009-12-20 PHI 27 SF 13
222 | 2009-12-20 PIT 37 GB 36
223 | 2009-12-20 SEA 7 TB 24
224 | 2009-12-20 CAR 26 MIN 7
225 | 2009-12-21 WAS 12 NYG 45
226 | 2009-12-25 TEN 17 LAC 42
227 | 2009-12-27 ATL 31 BUF 3
228 | 2009-12-27 CIN 17 KC 10
229 | 2009-12-27 CLE 23 OAK 9
230 | 2009-12-27 GB 48 SEA 10
231 | 2009-12-27 MIA 20 HOU 27
232 | 2009-12-27 NYG 9 CAR 41
233 | 2009-12-27 NE 35 JAC 7
234 | 2009-12-27 NO 17 TB 20
235 | 2009-12-27 PIT 23 BAL 20
236 | 2009-12-27 ARI 31 LAR 10
237 | 2009-12-27 SF 20 DET 6
238 | 2009-12-27 PHI 30 DEN 27
239 | 2009-12-27 IND 15 NYJ 29
240 | 2009-12-27 WAS 0 DAL 17
241 | 2009-12-28 CHI 36 MIN 30
242 | 2010-01-03 BUF 30 IND 7
243 | 2010-01-03 CAR 23 NO 10
244 | 2010-01-03 CLE 23 JAC 17
245 | 2010-01-03 DET 23 CHI 37
246 | 2010-01-03 HOU 34 NE 27
247 | 2010-01-03 MIA 24 PIT 30
248 | 2010-01-03 MIN 44 NYG 7
249 | 2010-01-03 LAR 6 SF 28
250 | 2010-01-03 TB 10 ATL 20
251 | 2010-01-03 DAL 24 PHI 0
252 | 2010-01-03 ARI 7 GB 33
253 | 2010-01-03 DEN 24 KC 44
254 | 2010-01-03 OAK 13 BAL 21
255 | 2010-01-03 LAC 23 WAS 20
256 | 2010-01-03 SEA 13 TEN 17
257 | 2010-01-03 NYJ 37 CIN 0
258 | 2010-09-09 NO 14 MIN 9
259 | 2010-09-12 TB 17 CLE 14
260 | 2010-09-12 BUF 10 MIA 15
261 | 2010-09-12 NE 38 CIN 24
262 | 2010-09-12 HOU 34 IND 24
263 | 2010-09-12 JAC 24 DEN 17
264 | 2010-09-12 TEN 38 OAK 13
265 | 2010-09-12 NYG 31 CAR 18
266 | 2010-09-12 CHI 19 DET 14
267 | 2010-09-12 PIT 15 ATL 9
268 | 2010-09-12 LAR 13 ARI 17
269 | 2010-09-12 PHI 20 GB 27
270 | 2010-09-12 SEA 31 SF 6
271 | 2010-09-12 WAS 13 DAL 7
272 | 2010-09-13 NYJ 9 BAL 10
273 | 2010-09-13 KC 21 LAC 14
274 | 2010-09-19 GB 34 BUF 7
275 | 2010-09-19 MIN 10 MIA 14
276 | 2010-09-19 CLE 14 KC 16
277 | 2010-09-19 TEN 11 PIT 19
278 | 2010-09-19 DAL 20 CHI 27
279 | 2010-09-19 DET 32 PHI 35
280 | 2010-09-19 ATL 41 ARI 7
281 | 2010-09-19 CAR 7 TB 20
282 | 2010-09-19 CIN 15 BAL 10
283 | 2010-09-19 DEN 31 SEA 14
284 | 2010-09-19 OAK 16 LAR 14
285 | 2010-09-19 WAS 27 HOU 30
286 | 2010-09-19 NYJ 28 NE 14
287 | 2010-09-19 LAC 38 JAC 13
288 | 2010-09-19 IND 38 NYG 14
289 | 2010-09-20 SF 22 NO 25
290 | 2010-09-26 NYG 10 TEN 29
291 | 2010-09-26 CAR 7 CIN 20
292 | 2010-09-26 TB 13 PIT 38
293 | 2010-09-26 NE 38 BUF 30
294 | 2010-09-26 BAL 24 CLE 17
295 | 2010-09-26 MIN 24 DET 10
296 | 2010-09-26 NO 24 ATL 27
297 | 2010-09-26 HOU 13 DAL 27
298 | 2010-09-26 KC 31 SF 10
299 | 2010-09-26 LAR 30 WAS 16
300 | 2010-09-26 JAC 3 PHI 28
301 | 2010-09-26 DEN 13 IND 27
302 | 2010-09-26 ARI 24 OAK 23
303 | 2010-09-26 SEA 27 LAC 20
304 | 2010-09-26 MIA 23 NYJ 31
305 | 2010-09-27 CHI 20 GB 17
306 | 2010-10-03 BUF 14 NYJ 38
307 | 2010-10-03 CLE 23 CIN 20
308 | 2010-10-03 PIT 14 BAL 17
309 | 2010-10-03 TEN 20 DEN 26
310 | 2010-10-03 GB 28 DET 26
311 | 2010-10-03 ATL 16 SF 14
312 | 2010-10-03 NO 16 CAR 14
313 | 2010-10-03 LAR 20 SEA 3
314 | 2010-10-03 JAC 31 IND 28
315 | 2010-10-03 OAK 24 HOU 31
316 | 2010-10-03 PHI 12 WAS 17
317 | 2010-10-03 LAC 41 ARI 10
318 | 2010-10-03 NYG 17 CHI 3
319 | 2010-10-04 MIA 14 NE 41
320 | 2010-10-10 BUF 26 JAC 36
321 | 2010-10-10 BAL 31 DEN 17
322 | 2010-10-10 IND 19 KC 9
323 | 2010-10-10 WAS 16 GB 13
324 | 2010-10-10 DET 44 LAR 6
325 | 2010-10-10 CAR 6 CHI 23
326 | 2010-10-10 CIN 21 TB 24
327 | 2010-10-10 CLE 10 ATL 20
328 | 2010-10-10 HOU 10 NYG 34
329 | 2010-10-10 ARI 30 NO 20
330 | 2010-10-10 DAL 27 TEN 34
331 | 2010-10-10 OAK 35 LAC 27
332 | 2010-10-10 SF 24 PHI 27
333 | 2010-10-11 NYJ 29 MIN 20
334 | 2010-10-17 GB 20 MIA 23
335 | 2010-10-17 LAR 20 LAC 17
336 | 2010-10-17 NE 23 BAL 20
337 | 2010-10-17 PIT 28 CLE 10
338 | 2010-10-17 HOU 35 KC 31
339 | 2010-10-17 NYG 28 DET 20
340 | 2010-10-17 PHI 31 ATL 17
341 | 2010-10-17 CHI 20 SEA 23
342 | 2010-10-17 TB 6 NO 31
343 | 2010-10-17 DEN 20 NYJ 24
344 | 2010-10-17 SF 17 OAK 9
345 | 2010-10-17 MIN 24 DAL 21
346 | 2010-10-17 WAS 24 IND 27
347 | 2010-10-18 JAC 3 TEN 30
348 | 2010-10-24 ATL 39 CIN 32
349 | 2010-10-24 MIA 22 PIT 23
350 | 2010-10-24 BAL 37 BUF 34
351 | 2010-10-24 KC 42 JAC 20
352 | 2010-10-24 NO 17 CLE 30
353 | 2010-10-24 CHI 14 WAS 17
354 | 2010-10-24 CAR 23 SF 20
355 | 2010-10-24 TB 18 LAR 17
356 | 2010-10-24 TEN 37 PHI 19
357 | 2010-10-24 SEA 22 ARI 10
358 | 2010-10-24 LAC 20 NE 23
359 | 2010-10-24 DEN 14 OAK 59
360 | 2010-10-24 GB 28 MIN 24
361 | 2010-10-25 DAL 35 NYG 41
362 | 2010-10-31 SF 24 DEN 16
363 | 2010-10-31 DAL 17 JAC 35
364 | 2010-10-31 CIN 14 MIA 22
365 | 2010-10-31 KC 13 BUF 10
366 | 2010-10-31 DET 37 WAS 25
367 | 2010-10-31 LAR 20 CAR 10
368 | 2010-10-31 NYJ 0 GB 9
369 | 2010-10-31 LAC 33 TEN 25
370 | 2010-10-31 NE 28 MIN 18
371 | 2010-10-31 ARI 35 TB 38
372 | 2010-10-31 OAK 33 SEA 3
373 | 2010-10-31 NO 20 PIT 10
374 | 2010-11-01 IND 30 HOU 17
375 | 2010-11-07 DET 20 NYJ 23
376 | 2010-11-07 BAL 26 MIA 10
377 | 2010-11-07 CLE 34 NE 14
378 | 2010-11-07 HOU 23 LAC 29
379 | 2010-11-07 BUF 19 CHI 22
380 | 2010-11-07 MIN 27 ARI 24
381 | 2010-11-07 ATL 27 TB 21
382 | 2010-11-07 CAR 3 NO 34
383 | 2010-11-07 SEA 7 NYG 41
384 | 2010-11-07 PHI 26 IND 24
385 | 2010-11-07 OAK 23 KC 20
386 | 2010-11-07 GB 45 DAL 7
387 | 2010-11-08 CIN 21 PIT 27
388 | 2010-11-11 ATL 26 BAL 21
389 | 2010-11-14 MIA 29 TEN 17
390 | 2010-11-14 CLE 20 NYJ 26
391 | 2010-11-14 IND 23 CIN 17
392 | 2010-11-14 JAC 31 HOU 24
393 | 2010-11-14 CHI 27 MIN 13
394 | 2010-11-14 TB 31 CAR 16
395 | 2010-11-14 BUF 14 DET 12
396 | 2010-11-14 DEN 49 KC 29
397 | 2010-11-14 NYG 20 DAL 33
398 | 2010-11-14 ARI 18 SEA 36
399 | 2010-11-14 SF 23 LAR 20
400 | 2010-11-14 PIT 26 NE 39
401 | 2010-11-15 WAS 28 PHI 59
402 | 2010-11-18 MIA 0 CHI 16
403 | 2010-11-21 CAR 13 BAL 37
404 | 2010-11-21 NYJ 30 HOU 27
405 | 2010-11-21 CIN 31 BUF 49
406 | 2010-11-21 PIT 35 OAK 3
407 | 2010-11-21 JAC 24 CLE 20
408 | 2010-11-21 DAL 35 DET 19
409 | 2010-11-21 MIN 3 GB 31
410 | 2010-11-21 TEN 16 WAS 19
411 | 2010-11-21 KC 31 ARI 13
412 | 2010-11-21 NO 34 SEA 19
413 | 2010-11-21 LAR 17 ATL 34
414 | 2010-11-21 SF 0 TB 21
415 | 2010-11-21 NE 31 IND 28
416 | 2010-11-21 PHI 27 NYG 17
417 | 2010-11-22 LAC 35 DEN 14
418 | 2010-11-25 DET 24 NE 45
419 | 2010-11-25 DAL 27 NO 30
420 | 2010-11-25 NYJ 26 CIN 10
421 | 2010-11-28 NYG 24 JAC 20
422 | 2010-11-28 BUF 16 PIT 19
423 | 2010-11-28 HOU 20 TEN 0
424 | 2010-11-28 WAS 13 MIN 17
425 | 2010-11-28 ATL 20 GB 17
426 | 2010-11-28 CLE 24 CAR 23
427 | 2010-11-28 SEA 24 KC 42
428 | 2010-11-28 OAK 17 MIA 33
429 | 2010-11-28 CHI 31 PHI 26
430 | 2010-11-28 BAL 17 TB 10
431 | 2010-11-28 DEN 33 LAR 36
432 | 2010-11-28 IND 14 LAC 36
433 | 2010-11-29 ARI 6 SF 27
434 | 2010-12-02 PHI 34 HOU 24
435 | 2010-12-05 MIN 38 BUF 14
436 | 2010-12-05 MIA 10 CLE 13
437 | 2010-12-05 TEN 6 JAC 17
438 | 2010-12-05 KC 10 DEN 6
439 | 2010-12-05 NYG 31 WAS 7
440 | 2010-12-05 DET 20 CHI 24
441 | 2010-12-05 GB 34 SF 16
442 | 2010-12-05 CIN 30 NO 34
443 | 2010-12-05 LAC 13 OAK 28
444 | 2010-12-05 TB 24 ATL 28
445 | 2010-12-05 IND 35 DAL 38
446 | 2010-12-05 ARI 6 LAR 19
447 | 2010-12-05 SEA 31 CAR 14
448 | 2010-12-05 BAL 10 PIT 13
449 | 2010-12-06 NE 45 NYJ 3
450 | 2010-12-09 TEN 28 IND 30
451 | 2010-12-12 BUF 13 CLE 6
452 | 2010-12-12 PIT 23 CIN 7
453 | 2010-12-12 JAC 38 OAK 31
454 | 2010-12-12 WAS 16 TB 17
455 | 2010-12-12 DET 7 GB 3
456 | 2010-12-12 CAR 10 ATL 31
457 | 2010-12-12 NO 31 LAR 13
458 | 2010-12-12 SF 40 SEA 21
459 | 2010-12-12 CHI 7 NE 36
460 | 2010-12-12 NYJ 6 MIA 10
461 | 2010-12-12 ARI 43 DEN 13
462 | 2010-12-12 LAC 31 KC 0
463 | 2010-12-12 DAL 27 PHI 30
464 | 2010-12-13 MIN 3 NYG 21
465 | 2010-12-13 HOU 28 BAL 34
466 | 2010-12-16 LAC 34 SF 7
467 | 2010-12-19 LAR 13 KC 27
468 | 2010-12-19 MIA 14 BUF 17
469 | 2010-12-19 CIN 19 CLE 17
470 | 2010-12-19 IND 34 JAC 24
471 | 2010-12-19 TEN 31 HOU 17
472 | 2010-12-19 DAL 33 WAS 30
473 | 2010-12-19 NYG 31 PHI 38
474 | 2010-12-19 CAR 19 ARI 12
475 | 2010-12-19 TB 20 DET 23
476 | 2010-12-19 BAL 30 NO 24
477 | 2010-12-19 SEA 18 ATL 34
478 | 2010-12-19 PIT 17 NYJ 22
479 | 2010-12-19 OAK 39 DEN 23
480 | 2010-12-19 NE 31 GB 27
481 | 2010-12-20 MIN 14 CHI 40
482 | 2010-12-23 PIT 27 CAR 3
483 | 2010-12-25 ARI 27 DAL 26
484 | 2010-12-26 CHI 38 NYJ 34
485 | 2010-12-26 BUF 3 NE 34
486 | 2010-12-26 CLE 10 BAL 20
487 | 2010-12-26 KC 34 TEN 14
488 | 2010-12-26 LAR 25 SF 17
489 | 2010-12-26 MIA 27 DET 34
490 | 2010-12-26 JAC 17 WAS 20
491 | 2010-12-26 DEN 24 HOU 23
492 | 2010-12-26 OAK 26 IND 31
493 | 2010-12-26 CIN 34 LAC 20
494 | 2010-12-26 TB 38 SEA 15
495 | 2010-12-26 GB 45 NYG 17
496 | 2010-12-27 ATL 14 NO 17
497 | 2010-12-28 PHI 14 MIN 24
498 | 2011-01-02 NE 38 MIA 7
499 | 2011-01-02 NYJ 38 BUF 7
500 | 2011-01-02 BAL 13 CIN 7
501 | 2011-01-02 CLE 9 PIT 41
502 | 2011-01-02 KC 10 OAK 31
503 | 2011-01-02 DET 20 MIN 13
504 | 2011-01-02 ATL 31 CAR 10
505 | 2011-01-02 NO 13 TB 23
506 | 2011-01-02 HOU 34 JAC 17
507 | 2011-01-02 IND 23 TEN 20
508 | 2011-01-02 PHI 13 DAL 14
509 | 2011-01-02 WAS 14 NYG 17
510 | 2011-01-02 GB 10 CHI 3
511 | 2011-01-02 DEN 28 LAC 33
512 | 2011-01-02 SF 38 ARI 7
513 | 2011-01-02 SEA 16 LAR 6
514 | 2011-09-08 GB 42 NO 34
515 | 2011-09-11 BAL 35 PIT 7
516 | 2011-09-11 CLE 17 CIN 27
517 | 2011-09-11 HOU 34 IND 7
518 | 2011-09-11 JAC 16 TEN 14
519 | 2011-09-11 KC 7 BUF 41
520 | 2011-09-11 CHI 30 ATL 12
521 | 2011-09-11 TB 20 DET 27
522 | 2011-09-11 LAR 13 PHI 31
523 | 2011-09-11 WAS 28 NYG 14
524 | 2011-09-11 ARI 28 CAR 21
525 | 2011-09-11 SF 33 SEA 17
526 | 2011-09-11 LAC 24 MIN 17
527 | 2011-09-11 NYJ 27 DAL 24
528 | 2011-09-12 MIA 24 NE 38
529 | 2011-09-12 DEN 20 OAK 23
530 | 2011-09-18 DET 48 KC 3
531 | 2011-09-18 BUF 38 OAK 35
532 | 2011-09-18 TEN 26 BAL 13
533 | 2011-09-18 NYJ 32 JAC 3
534 | 2011-09-18 IND 19 CLE 27
535 | 2011-09-18 WAS 22 ARI 21
536 | 2011-09-18 MIN 20 TB 24
537 | 2011-09-18 CAR 23 GB 30
538 | 2011-09-18 NO 30 CHI 13
539 | 2011-09-18 PIT 24 SEA 0
540 | 2011-09-18 SF 24 DAL 27
541 | 2011-09-18 NE 35 LAC 21
542 | 2011-09-18 DEN 24 CIN 22
543 | 2011-09-18 MIA 13 HOU 23
544 | 2011-09-18 ATL 35 PHI 31
545 | 2011-09-19 NYG 28 LAR 16
546 | 2011-09-25 CAR 16 JAC 10
547 | 2011-09-25 NO 40 HOU 33
548 | 2011-09-25 BUF 34 NE 31
549 | 2011-09-25 CLE 17 MIA 16
550 | 2011-09-25 TEN 17 DEN 14
551 | 2011-09-25 PHI 16 NYG 29
552 | 2011-09-25 MIN 23 DET 26
553 | 2011-09-25 CIN 8 SF 13
554 | 2011-09-25 OAK 34 NYJ 24
555 | 2011-09-25 LAC 20 KC 17
556 | 2011-09-25 LAR 7 BAL 37
557 | 2011-09-25 CHI 17 GB 27
558 | 2011-09-25 SEA 13 ARI 10
559 | 2011-09-25 TB 16 ATL 13
560 | 2011-09-25 IND 20 PIT 23
561 | 2011-09-26 DAL 18 WAS 16
562 | 2011-10-02 CIN 23 BUF 20
563 | 2011-10-02 CLE 13 TEN 31
564 | 2011-10-02 HOU 17 PIT 10
565 | 2011-10-02 DAL 30 DET 34
566 | 2011-10-02 PHI 23 SF 24
567 | 2011-10-02 CHI 34 CAR 29
568 | 2011-10-02 LAR 10 WAS 17
569 | 2011-10-02 JAC 10 NO 23
570 | 2011-10-02 KC 22 MIN 17
571 | 2011-10-02 ARI 27 NYG 31
572 | 2011-10-02 SEA 28 ATL 30
573 | 2011-10-02 GB 49 DEN 23
574 | 2011-10-02 OAK 19 NE 31
575 | 2011-10-02 LAC 26 MIA 16
576 | 2011-10-02 BAL 34 NYJ 17
577 | 2011-10-03 TB 24 IND 17
578 | 2011-10-09 PIT 38 TEN 17
579 | 2011-10-09 HOU 20 OAK 25
580 | 2011-10-09 IND 24 KC 28
581 | 2011-10-09 JAC 20 CIN 30
582 | 2011-10-09 NYG 25 SEA 36
583 | 2011-10-09 MIN 34 ARI 10
584 | 2011-10-09 CAR 27 NO 30
585 | 2011-10-09 BUF 31 PHI 24
586 | 2011-10-09 SF 48 TB 3
587 | 2011-10-09 NE 30 NYJ 21
588 | 2011-10-09 DEN 24 LAC 29
589 | 2011-10-09 ATL 14 GB 25
590 | 2011-10-10 DET 24 CHI 13
591 | 2011-10-16 NYG 27 BUF 24
592 | 2011-10-16 CIN 27 IND 17
593 | 2011-10-16 PIT 17 JAC 13
594 | 2011-10-16 WAS 13 PHI 20
595 | 2011-10-16 DET 19 SF 25
596 | 2011-10-16 GB 24 LAR 3
597 | 2011-10-16 ATL 31 CAR 17
598 | 2011-10-16 OAK 24 CLE 17
599 | 2011-10-16 BAL 29 HOU 14
600 | 2011-10-16 TB 26 NO 20
601 | 2011-10-16 NE 20 DAL 16
602 | 2011-10-16 CHI 39 MIN 10
603 | 2011-10-17 NYJ 24 MIA 6
604 | 2011-10-23 MIA 15 DEN 18
605 | 2011-10-23 NYJ 27 LAC 21
606 | 2011-10-23 TEN 7 HOU 41
607 | 2011-10-23 DET 16 ATL 23
608 | 2011-10-23 CAR 33 WAS 20
609 | 2011-10-23 TB 18 CHI 24
610 | 2011-10-23 CLE 6 SEA 3
611 | 2011-10-23 ARI 20 PIT 32
612 | 2011-10-23 OAK 0 KC 28
613 | 2011-10-23 MIN 27 GB 33
614 | 2011-10-23 DAL 34 LAR 7
615 | 2011-10-23 NO 62 IND 7
616 | 2011-10-24 JAC 12 BAL 7
617 | 2011-10-30 NYG 20 MIA 17
618 | 2011-10-30 HOU 24 JAC 14
619 | 2011-10-30 TEN 27 IND 10
620 | 2011-10-30 CAR 21 MIN 24
621 | 2011-10-30 LAR 31 NO 21
622 | 2011-10-30 BAL 30 ARI 27
623 | 2011-10-30 DEN 10 DET 45
624 | 2011-10-30 BUF 23 WAS 0
625 | 2011-10-30 PIT 25 NE 17
626 | 2011-10-30 SF 20 CLE 10
627 | 2011-10-30 SEA 12 CIN 34
628 | 2011-10-30 PHI 34 DAL 7
629 | 2011-10-31 KC 23 LAC 20
630 | 2011-11-06 BUF 11 NYJ 27
631 | 2011-11-06 HOU 30 CLE 12
632 | 2011-11-06 KC 3 MIA 31
633 | 2011-11-06 DAL 23 SEA 13
634 | 2011-11-06 WAS 11 SF 19
635 | 2011-11-06 NO 27 TB 16
636 | 2011-11-06 IND 7 ATL 31
637 | 2011-11-06 OAK 24 DEN 38
638 | 2011-11-06 TEN 17 CIN 24
639 | 2011-11-06 NE 20 NYG 24
640 | 2011-11-06 LAC 38 GB 45
641 | 2011-11-06 ARI 19 LAR 13
642 | 2011-11-06 PIT 20 BAL 23
643 | 2011-11-07 PHI 24 CHI 30
644 | 2011-11-10 LAC 17 OAK 24
645 | 2011-11-13 DAL 44 BUF 7
646 | 2011-11-13 CAR 3 TEN 30
647 | 2011-11-13 TB 9 HOU 37
648 | 2011-11-13 CIN 17 PIT 24
649 | 2011-11-13 IND 3 JAC 17
650 | 2011-11-13 KC 10 DEN 17
651 | 2011-11-13 PHI 17 ARI 21
652 | 2011-11-13 ATL 23 NO 26
653 | 2011-11-13 MIA 20 WAS 9
654 | 2011-11-13 CLE 12 LAR 13
655 | 2011-11-13 SEA 22 BAL 17
656 | 2011-11-13 CHI 37 DET 13
657 | 2011-11-13 SF 27 NYG 20
658 | 2011-11-13 NYJ 16 NE 37
659 | 2011-11-14 GB 45 MIN 7
660 | 2011-11-17 DEN 17 NYJ 13
661 | 2011-11-20 MIN 21 OAK 27
662 | 2011-11-20 MIA 35 BUF 8
663 | 2011-11-20 CLE 14 JAC 10
664 | 2011-11-20 BAL 31 CIN 24
665 | 2011-11-20 WAS 24 DAL 27
666 | 2011-11-20 DET 49 CAR 35
667 | 2011-11-20 GB 35 TB 26
668 | 2011-11-20 SF 23 ARI 7
669 | 2011-11-20 LAR 7 SEA 24
670 | 2011-11-20 ATL 23 TEN 17
671 | 2011-11-20 CHI 31 LAC 20
672 | 2011-11-20 NYG 10 PHI 17
673 | 2011-11-21 NE 34 KC 3
674 | 2011-11-24 DET 15 GB 27
675 | 2011-11-24 DAL 20 MIA 19
676 | 2011-11-24 BAL 16 SF 6
677 | 2011-11-27 NYJ 28 BUF 24
678 | 2011-11-27 CIN 23 CLE 20
679 | 2011-11-27 JAC 13 HOU 20
680 | 2011-11-27 ATL 24 MIN 14
681 | 2011-11-27 LAR 20 ARI 23
682 | 2011-11-27 IND 19 CAR 27
683 | 2011-11-27 TEN 23 TB 17
684 | 2011-11-27 SEA 17 WAS 23
685 | 2011-11-27 OAK 25 CHI 20
686 | 2011-11-27 PHI 20 NE 38
687 | 2011-11-27 LAC 13 DEN 16
688 | 2011-11-27 KC 9 PIT 13
689 | 2011-11-28 NO 49 NYG 24
690 | 2011-12-01 SEA 31 PHI 14
691 | 2011-12-04 WAS 19 NYJ 34
692 | 2011-12-04 CHI 3 KC 10
693 | 2011-12-04 BUF 17 TEN 23
694 | 2011-12-04 MIA 34 OAK 14
695 | 2011-12-04 PIT 35 CIN 7
696 | 2011-12-04 TB 19 CAR 38
697 | 2011-12-04 HOU 17 ATL 10
698 | 2011-12-04 MIN 32 DEN 35
699 | 2011-12-04 NE 31 IND 24
700 | 2011-12-04 CLE 10 BAL 24
701 | 2011-12-04 NYG 35 GB 38
702 | 2011-12-04 ARI 19 DAL 13
703 | 2011-12-04 SF 26 LAR 0
704 | 2011-12-04 NO 31 DET 17
705 | 2011-12-05 JAC 14 LAC 38
706 | 2011-12-08 PIT 14 CLE 3
707 | 2011-12-11 WAS 27 NE 34
708 | 2011-12-11 NYJ 37 KC 10
709 | 2011-12-11 CIN 19 HOU 20
710 | 2011-12-11 BAL 24 IND 10
711 | 2011-12-11 DET 34 MIN 28
712 | 2011-12-11 CAR 23 ATL 31
713 | 2011-12-11 MIA 10 PHI 26
714 | 2011-12-11 JAC 41 TB 14
715 | 2011-12-11 TEN 17 NO 22
716 | 2011-12-11 ARI 21 SF 19
717 | 2011-12-11 DEN 13 CHI 10
718 | 2011-12-11 GB 46 OAK 16
719 | 2011-12-11 LAC 37 BUF 10
720 | 2011-12-11 DAL 34 NYG 37
721 | 2011-12-12 SEA 30 LAR 13
722 | 2011-12-15 ATL 41 JAC 14
723 | 2011-12-17 TB 15 DAL 31
724 | 2011-12-18 LAR 13 CIN 20
725 | 2011-12-18 BUF 23 MIA 30
726 | 2011-12-18 IND 27 TEN 13
727 | 2011-12-18 NYG 10 WAS 23
728 | 2011-12-18 CHI 14 SEA 38
729 | 2011-12-18 MIN 20 NO 42
730 | 2011-12-18 HOU 13 CAR 28
731 | 2011-12-18 KC 19 GB 14
732 | 2011-12-18 OAK 27 DET 28
733 | 2011-12-18 PHI 45 NYJ 19
734 | 2011-12-18 ARI 20 CLE 17
735 | 2011-12-18 DEN 23 NE 41
736 | 2011-12-18 LAC 34 BAL 14
737 | 2011-12-19 SF 20 PIT 3
738 | 2011-12-22 IND 19 HOU 16
739 | 2011-12-24 BUF 40 DEN 14
740 | 2011-12-24 NE 27 MIA 24
741 | 2011-12-24 BAL 20 CLE 14
742 | 2011-12-24 TEN 23 JAC 17
743 | 2011-12-24 KC 13 OAK 16
744 | 2011-12-24 NYJ 14 NYG 29
745 | 2011-12-24 WAS 26 MIN 33
746 | 2011-12-24 CAR 48 TB 16
747 | 2011-12-24 CIN 23 ARI 16
748 | 2011-12-24 PIT 27 LAR 0
749 | 2011-12-24 DET 38 LAC 10
750 | 2011-12-24 DAL 7 PHI 20
751 | 2011-12-24 SEA 17 SF 19
752 | 2011-12-25 GB 35 CHI 21
753 | 2011-12-26 NO 45 ATL 16
754 | 2012-01-01 MIA 19 NYJ 17
755 | 2012-01-01 NE 49 BUF 21
756 | 2012-01-01 HOU 22 TEN 23
757 | 2012-01-01 JAC 19 IND 13
758 | 2012-01-01 PHI 34 WAS 10
759 | 2012-01-01 GB 45 DET 41
760 | 2012-01-01 MIN 13 CHI 17
761 | 2012-01-01 NO 45 CAR 17
762 | 2012-01-01 LAR 27 SF 34
763 | 2012-01-01 CIN 16 BAL 24
764 | 2012-01-01 CLE 9 PIT 13
765 | 2012-01-01 ATL 45 TB 24
766 | 2012-01-01 DEN 3 KC 7
767 | 2012-01-01 OAK 26 LAC 38
768 | 2012-01-01 ARI 23 SEA 20
769 | 2012-01-01 NYG 31 DAL 14
770 | 2012-09-05 NYG 17 DAL 24
771 | 2012-09-09 CHI 41 IND 21
772 | 2012-09-09 MIN 26 JAC 23
773 | 2012-09-09 NYJ 48 BUF 28
774 | 2012-09-09 HOU 30 MIA 10
775 | 2012-09-09 TEN 13 NE 34
776 | 2012-09-09 DET 27 LAR 23
777 | 2012-09-09 NO 32 WAS 40
778 | 2012-09-09 CLE 16 PHI 17
779 | 2012-09-09 KC 24 ATL 40
780 | 2012-09-09 GB 22 SF 30
781 | 2012-09-09 ARI 20 SEA 16
782 | 2012-09-09 TB 16 CAR 10
783 | 2012-09-09 DEN 31 PIT 19
784 | 2012-09-10 BAL 44 CIN 13
785 | 2012-09-10 OAK 14 LAC 22
786 | 2012-09-13 GB 23 CHI 10
787 | 2012-09-16 NYG 41 TB 34
788 | 2012-09-16 CAR 35 NO 27
789 | 2012-09-16 NE 18 ARI 20
790 | 2012-09-16 IND 23 MIN 20
791 | 2012-09-16 PHI 24 BAL 23
792 | 2012-09-16 BUF 35 KC 17
793 | 2012-09-16 CIN 34 CLE 27
794 | 2012-09-16 JAC 7 HOU 27
795 | 2012-09-16 MIA 35 OAK 13
796 | 2012-09-16 SEA 27 DAL 7
797 | 2012-09-16 LAR 31 WAS 28
798 | 2012-09-16 PIT 27 NYJ 10
799 | 2012-09-16 LAC 38 TEN 10
800 | 2012-09-16 SF 27 DET 19
801 | 2012-09-17 ATL 27 DEN 21
802 | 2012-09-20 CAR 7 NYG 36
803 | 2012-09-23 DAL 16 TB 10
804 | 2012-09-23 CHI 23 LAR 6
805 | 2012-09-23 MIN 24 SF 13
806 | 2012-09-23 TEN 44 DET 41
807 | 2012-09-23 WAS 31 CIN 38
808 | 2012-09-23 NO 24 KC 27
809 | 2012-09-23 MIA 20 NYJ 23
810 | 2012-09-23 CLE 14 BUF 24
811 | 2012-09-23 IND 17 JAC 22
812 | 2012-09-23 ARI 27 PHI 6
813 | 2012-09-23 LAC 3 ATL 27
814 | 2012-09-23 DEN 25 HOU 31
815 | 2012-09-23 OAK 34 PIT 31
816 | 2012-09-23 BAL 31 NE 30
817 | 2012-09-24 SEA 14 GB 12
818 | 2012-09-27 BAL 23 CLE 16
819 | 2012-09-30 BUF 28 NE 52
820 | 2012-09-30 HOU 38 TEN 14
821 | 2012-09-30 KC 20 LAC 37
822 | 2012-09-30 DET 13 MIN 20
823 | 2012-09-30 ATL 30 CAR 28
824 | 2012-09-30 LAR 19 SEA 13
825 | 2012-09-30 NYJ 0 SF 34
826 | 2012-09-30 ARI 24 MIA 21
827 | 2012-09-30 DEN 37 OAK 6
828 | 2012-09-30 JAC 10 CIN 27
829 | 2012-09-30 GB 28 NO 27
830 | 2012-09-30 TB 22 WAS 24
831 | 2012-09-30 PHI 19 NYG 17
832 | 2012-10-01 DAL 18 CHI 34
833 | 2012-10-04 LAR 17 ARI 3
834 | 2012-10-07 WAS 17 ATL 24
835 | 2012-10-07 PIT 16 PHI 14
836 | 2012-10-07 IND 30 GB 27
837 | 2012-10-07 NYG 41 CLE 27
838 | 2012-10-07 CIN 13 MIA 17
839 | 2012-10-07 KC 6 BAL 9
840 | 2012-10-07 CAR 12 SEA 16
841 | 2012-10-07 JAC 3 CHI 41
842 | 2012-10-07 MIN 30 TEN 7
843 | 2012-10-07 NE 31 DEN 21
844 | 2012-10-07 SF 45 BUF 3
845 | 2012-10-07 NO 31 LAC 24
846 | 2012-10-08 NYJ 17 HOU 23
847 | 2012-10-11 TEN 26 PIT 23
848 | 2012-10-14 ATL 23 OAK 20
849 | 2012-10-14 TB 38 KC 10
850 | 2012-10-14 NYJ 35 IND 9
851 | 2012-10-14 CLE 34 CIN 24
852 | 2012-10-14 PHI 23 DET 26
853 | 2012-10-14 MIA 17 LAR 14
854 | 2012-10-14 BAL 31 DAL 29
855 | 2012-10-14 ARI 16 BUF 19
856 | 2012-10-14 SEA 24 NE 23
857 | 2012-10-14 SF 3 NYG 26
858 | 2012-10-14 WAS 38 MIN 26
859 | 2012-10-14 HOU 24 GB 42
860 | 2012-10-15 LAC 24 DEN 35
861 | 2012-10-18 SF 13 SEA 6
862 | 2012-10-21 NYG 27 WAS 23
863 | 2012-10-21 MIN 21 ARI 14
864 | 2012-10-21 CAR 14 DAL 19
865 | 2012-10-21 TB 28 NO 35
866 | 2012-10-21 LAR 20 GB 30
867 | 2012-10-21 HOU 43 BAL 13
868 | 2012-10-21 IND 17 CLE 13
869 | 2012-10-21 BUF 34 TEN 35
870 | 2012-10-21 NE 29 NYJ 26
871 | 2012-10-21 OAK 26 JAC 23
872 | 2012-10-21 CIN 17 PIT 24
873 | 2012-10-22 CHI 13 DET 7
874 | 2012-10-25 MIN 17 TB 36
875 | 2012-10-28 GB 24 JAC 15
876 | 2012-10-28 NYJ 9 MIA 30
877 | 2012-10-28 CLE 7 LAC 6
878 | 2012-10-28 TEN 13 IND 19
879 | 2012-10-28 LAR 7 NE 45
880 | 2012-10-28 PHI 17 ATL 30
881 | 2012-10-28 CHI 23 CAR 22
882 | 2012-10-28 DET 28 SEA 24
883 | 2012-10-28 PIT 27 WAS 12
884 | 2012-10-28 KC 16 OAK 26
885 | 2012-10-28 DAL 24 NYG 29
886 | 2012-10-28 DEN 34 NO 14
887 | 2012-10-29 ARI 3 SF 24
888 | 2012-11-01 LAC 31 KC 13
889 | 2012-11-04 WAS 13 CAR 21
890 | 2012-11-04 GB 31 ARI 17
891 | 2012-11-04 JAC 14 DET 31
892 | 2012-11-04 TEN 20 CHI 51
893 | 2012-11-04 CIN 23 DEN 31
894 | 2012-11-04 CLE 15 BAL 25
895 | 2012-11-04 HOU 21 BUF 9
896 | 2012-11-04 IND 23 MIA 20
897 | 2012-11-04 SEA 30 MIN 20
898 | 2012-11-04 OAK 32 TB 42
899 | 2012-11-04 NYG 20 PIT 24
900 | 2012-11-04 ATL 19 DAL 13
901 | 2012-11-05 NO 28 PHI 13
902 | 2012-11-08 JAC 10 IND 27
903 | 2012-11-11 CAR 14 DEN 36
904 | 2012-11-11 TB 34 LAC 24
905 | 2012-11-11 MIA 3 TEN 37
906 | 2012-11-11 NE 37 BUF 31
907 | 2012-11-11 BAL 55 OAK 20
908 | 2012-11-11 CIN 31 NYG 13
909 | 2012-11-11 NO 31 ATL 27
910 | 2012-11-11 MIN 34 DET 24
911 | 2012-11-11 SEA 28 NYJ 7
912 | 2012-11-11 PHI 23 DAL 38
913 | 2012-11-11 SF 24 LAR 24
914 | 2012-11-11 CHI 6 HOU 13
915 | 2012-11-12 PIT 16 KC 13
916 | 2012-11-15 BUF 19 MIA 14
917 | 2012-11-18 WAS 31 PHI 6
918 | 2012-11-18 DET 20 GB 24
919 | 2012-11-18 ATL 23 ARI 19
920 | 2012-11-18 CAR 21 TB 27
921 | 2012-11-18 DAL 23 CLE 20
922 | 2012-11-18 LAR 13 NYJ 27
923 | 2012-11-18 HOU 43 JAC 37
924 | 2012-11-18 KC 6 CIN 28
925 | 2012-11-18 OAK 17 NO 38
926 | 2012-11-18 NE 59 IND 24
927 | 2012-11-18 DEN 30 LAC 23
928 | 2012-11-18 PIT 10 BAL 13
929 | 2012-11-19 SF 32 CHI 7
930 | 2012-11-22 DET 31 HOU 34
931 | 2012-11-22 DAL 31 WAS 38
932 | 2012-11-22 NYJ 19 NE 49
933 | 2012-11-25 CIN 34 OAK 10
934 | 2012-11-25 CLE 20 PIT 14
935 | 2012-11-25 IND 20 BUF 13
936 | 2012-11-25 JAC 24 TEN 19
937 | 2012-11-25 KC 9 DEN 17
938 | 2012-11-25 CHI 28 MIN 10
939 | 2012-11-25 TB 23 ATL 24
940 | 2012-11-25 MIA 24 SEA 21
941 | 2012-11-25 LAC 13 BAL 16
942 | 2012-11-25 NO 21 SF 31
943 | 2012-11-25 ARI 17 LAR 31
944 | 2012-11-25 NYG 38 GB 10
945 | 2012-11-26 PHI 22 CAR 30
946 | 2012-11-29 ATL 23 NO 13
947 | 2012-12-02 CHI 17 SEA 23
948 | 2012-12-02 GB 23 MIN 14
949 | 2012-12-02 LAR 16 SF 13
950 | 2012-12-02 NYJ 7 ARI 6
951 | 2012-12-02 KC 27 CAR 21
952 | 2012-12-02 DET 33 IND 35
953 | 2012-12-02 BUF 34 JAC 18
954 | 2012-12-02 MIA 16 NE 23
955 | 2012-12-02 TEN 10 HOU 24
956 | 2012-12-02 DEN 31 TB 23
957 | 2012-12-02 BAL 20 PIT 23
958 | 2012-12-02 OAK 17 CLE 20
959 | 2012-12-02 LAC 13 CIN 20
960 | 2012-12-02 DAL 38 PHI 33
961 | 2012-12-03 WAS 17 NYG 16
962 | 2012-12-06 OAK 13 DEN 26
963 | 2012-12-09 WAS 31 BAL 28
964 | 2012-12-09 CLE 30 KC 7
965 | 2012-12-09 PIT 24 LAC 34
966 | 2012-12-09 IND 27 TEN 23
967 | 2012-12-09 JAC 10 NYJ 17
968 | 2012-12-09 MIN 21 CHI 14
969 | 2012-12-09 CAR 30 ATL 20
970 | 2012-12-09 TB 21 PHI 23
971 | 2012-12-09 BUF 12 LAR 15
972 | 2012-12-09 CIN 19 DAL 20
973 | 2012-12-09 SF 27 MIA 13
974 | 2012-12-09 NYG 52 NO 27
975 | 2012-12-09 SEA 58 ARI 0
976 | 2012-12-09 GB 27 DET 20
977 | 2012-12-10 NE 42 HOU 14
978 | 2012-12-13 PHI 13 CIN 34
979 | 2012-12-16 CHI 13 GB 21
980 | 2012-12-16 ATL 34 NYG 0
981 | 2012-12-16 NO 41 TB 0
982 | 2012-12-16 LAR 22 MIN 36
983 | 2012-12-16 CLE 21 WAS 38
984 | 2012-12-16 MIA 24 JAC 3
985 | 2012-12-16 BAL 17 DEN 34
986 | 2012-12-16 HOU 29 IND 17
987 | 2012-12-16 ARI 38 DET 10
988 | 2012-12-16 LAC 7 CAR 31
989 | 2012-12-16 BUF 17 SEA 50
990 | 2012-12-16 DAL 27 PIT 24
991 | 2012-12-16 OAK 15 KC 0
992 | 2012-12-16 NE 34 SF 41
993 | 2012-12-17 TEN 14 NYJ 10
994 | 2012-12-22 DET 18 ATL 31
995 | 2012-12-23 GB 55 TEN 7
996 | 2012-12-23 CAR 17 OAK 6
997 | 2012-12-23 MIA 24 BUF 10
998 | 2012-12-23 PIT 10 CIN 13
999 | 2012-12-23 JAC 16 NE 23
1000 | 2012-12-23 KC 13 IND 20
1001 | 2012-12-23 DAL 31 NO 34
1002 | 2012-12-23 PHI 20 WAS 27
1003 | 2012-12-23 TB 13 LAR 28
1004 | 2012-12-23 HOU 6 MIN 23
1005 | 2012-12-23 NYJ 17 LAC 27
1006 | 2012-12-23 DEN 34 CLE 12
1007 | 2012-12-23 BAL 33 NYG 14
1008 | 2012-12-23 ARI 13 CHI 28
1009 | 2012-12-23 SEA 42 SF 13
1010 | 2012-12-30 BUF 28 NYJ 9
1011 | 2012-12-30 CIN 23 BAL 17
1012 | 2012-12-30 PIT 24 CLE 10
1013 | 2012-12-30 IND 28 HOU 16
1014 | 2012-12-30 TEN 38 JAC 20
1015 | 2012-12-30 NYG 42 PHI 7
1016 | 2012-12-30 DET 24 CHI 26
1017 | 2012-12-30 ATL 17 TB 22
1018 | 2012-12-30 NO 38 CAR 44
1019 | 2012-12-30 NE 28 MIA 0
1020 | 2012-12-30 MIN 37 GB 34
1021 | 2012-12-30 DEN 38 KC 3
1022 | 2012-12-30 LAC 24 OAK 21
1023 | 2012-12-30 SF 27 ARI 13
1024 | 2012-12-30 SEA 20 LAR 13
1025 | 2012-12-30 WAS 28 DAL 18
1026 | 2013-09-05 DEN 49 BAL 27
1027 | 2013-09-08 BUF 21 NE 23
1028 | 2013-09-08 CAR 7 SEA 12
1029 | 2013-09-08 CHI 24 CIN 21
1030 | 2013-09-08 CLE 10 MIA 23
1031 | 2013-09-08 DET 34 MIN 24
1032 | 2013-09-08 IND 21 OAK 17
1033 | 2013-09-08 JAC 2 KC 28
1034 | 2013-09-08 NYJ 18 TB 17
1035 | 2013-09-08 NO 23 ATL 17
1036 | 2013-09-08 PIT 9 TEN 16
1037 | 2013-09-08 LAR 27 ARI 24
1038 | 2013-09-08 SF 34 GB 28
1039 | 2013-09-08 DAL 36 NYG 31
1040 | 2013-09-09 WAS 27 PHI 33
1041 | 2013-09-09 LAC 28 HOU 31
1042 | 2013-09-12 NE 13 NYJ 10
1043 | 2013-09-15 ATL 31 LAR 24
1044 | 2013-09-15 BAL 14 CLE 6
1045 | 2013-09-15 BUF 24 CAR 23
1046 | 2013-09-15 CHI 31 MIN 30
1047 | 2013-09-15 GB 38 WAS 20
1048 | 2013-09-15 HOU 30 TEN 24
1049 | 2013-09-15 IND 20 MIA 24
1050 | 2013-09-15 KC 17 DAL 16
1051 | 2013-09-15 PHI 30 LAC 33
1052 | 2013-09-15 ARI 25 DET 21
1053 | 2013-09-15 TB 14 NO 16
1054 | 2013-09-15 NYG 23 DEN 41
1055 | 2013-09-15 OAK 19 JAC 9
1056 | 2013-09-15 SEA 29 SF 3
1057 | 2013-09-16 CIN 20 PIT 10
1058 | 2013-09-19 PHI 16 KC 26
1059 | 2013-09-22 BAL 30 HOU 9
1060 | 2013-09-22 CIN 34 GB 30
1061 | 2013-09-22 DAL 31 LAR 7
1062 | 2013-09-22 MIN 27 CLE 31
1063 | 2013-09-22 NE 23 TB 3
1064 | 2013-09-22 NO 31 ARI 7
1065 | 2013-09-22 TEN 20 LAC 17
1066 | 2013-09-22 WAS 20 DET 27
1067 | 2013-09-22 CAR 38 NYG 0
1068 | 2013-09-22 MIA 27 ATL 23
1069 | 2013-09-22 NYJ 27 BUF 20
1070 | 2013-09-22 SF 7 IND 27
1071 | 2013-09-22 SEA 45 JAC 17
1072 | 2013-09-22 PIT 23 CHI 40
1073 | 2013-09-23 DEN 37 OAK 21
1074 | 2013-09-26 LAR 11 SF 35
1075 | 2013-09-29 BUF 23 BAL 20
1076 | 2013-09-29 CLE 17 CIN 6
1077 | 2013-09-29 DET 40 CHI 32
1078 | 2013-09-29 HOU 20 SEA 23
1079 | 2013-09-29 JAC 3 IND 37
1080 | 2013-09-29 KC 31 NYG 7
1081 | 2013-09-29 MIN 34 PIT 27
1082 | 2013-09-29 TB 10 ARI 13
1083 | 2013-09-29 TEN 38 NYJ 13
1084 | 2013-09-29 DEN 52 PHI 20
1085 | 2013-09-29 OAK 14 WAS 24
1086 | 2013-09-29 LAC 30 DAL 21
1087 | 2013-09-29 ATL 23 NE 30
1088 | 2013-09-30 NO 38 MIA 17
1089 | 2013-10-03 CLE 37 BUF 24
1090 | 2013-10-06 CHI 18 NO 26
1091 | 2013-10-06 CIN 13 NE 6
1092 | 2013-10-06 GB 22 DET 9
1093 | 2013-10-06 IND 34 SEA 28
1094 | 2013-10-06 MIA 23 BAL 26
1095 | 2013-10-06 NYG 21 PHI 36
1096 | 2013-10-06 LAR 34 JAC 20
1097 | 2013-10-06 TEN 17 KC 26
1098 | 2013-10-06 ARI 22 CAR 6
1099 | 2013-10-06 DAL 48 DEN 51
1100 | 2013-10-06 SF 34 HOU 3
1101 | 2013-10-06 OAK 27 LAC 17
1102 | 2013-10-07 ATL 28 NYJ 30
1103 | 2013-10-10 CHI 27 NYG 21
1104 | 2013-10-13 BAL 17 GB 19
1105 | 2013-10-13 BUF 24 CIN 27
1106 | 2013-10-13 CLE 17 DET 31
1107 | 2013-10-13 HOU 13 LAR 38
1108 | 2013-10-13 KC 24 OAK 7
1109 | 2013-10-13 MIN 10 CAR 35
1110 | 2013-10-13 NYJ 6 PIT 19
1111 | 2013-10-13 TB 20 PHI 31
1112 | 2013-10-13 DEN 35 JAC 19
1113 | 2013-10-13 SEA 20 TEN 13
1114 | 2013-10-13 NE 30 NO 27
1115 | 2013-10-13 SF 32 ARI 20
1116 | 2013-10-13 DAL 31 WAS 16
1117 | 2013-10-14 LAC 19 IND 9
1118 | 2013-10-17 ARI 22 SEA 34
1119 | 2013-10-20 ATL 31 TB 23
1120 | 2013-10-20 CAR 30 LAR 15
1121 | 2013-10-20 DET 24 CIN 27
1122 | 2013-10-20 JAC 6 LAC 24
1123 | 2013-10-20 MIA 21 BUF 23
1124 | 2013-10-20 NYJ 30 NE 27
1125 | 2013-10-20 PHI 3 DAL 17
1126 | 2013-10-20 WAS 45 CHI 41
1127 | 2013-10-20 TEN 17 SF 31
1128 | 2013-10-20 GB 31 CLE 13
1129 | 2013-10-20 KC 17 HOU 16
1130 | 2013-10-20 PIT 19 BAL 16
1131 | 2013-10-20 IND 39 DEN 33
1132 | 2013-10-21 NYG 23 MIN 7
1133 | 2013-10-24 TB 13 CAR 31
1134 | 2013-10-27 DET 31 DAL 30
1135 | 2013-10-27 JAC 10 SF 42
1136 | 2013-10-27 KC 23 CLE 17
1137 | 2013-10-27 NE 27 MIA 17
1138 | 2013-10-27 NO 35 BUF 17
1139 | 2013-10-27 PHI 7 NYG 15
1140 | 2013-10-27 OAK 21 PIT 18
1141 | 2013-10-27 CIN 49 NYJ 9
1142 | 2013-10-27 ARI 27 ATL 13
1143 | 2013-10-27 DEN 45 WAS 21
1144 | 2013-10-27 MIN 31 GB 44
1145 | 2013-10-28 LAR 9 SEA 14
1146 | 2013-10-31 MIA 22 CIN 20
1147 | 2013-11-03 BUF 13 KC 23
1148 | 2013-11-03 CAR 34 ATL 10
1149 | 2013-11-03 DAL 27 MIN 23
1150 | 2013-11-03 NYJ 26 NO 20
1151 | 2013-11-03 LAR 21 TEN 28
1152 | 2013-11-03 WAS 30 LAC 24
1153 | 2013-11-03 OAK 20 PHI 49
1154 | 2013-11-03 SEA 27 TB 24
1155 | 2013-11-03 CLE 24 BAL 18
1156 | 2013-11-03 NE 55 PIT 31
1157 | 2013-11-03 HOU 24 IND 27
1158 | 2013-11-04 GB 20 CHI 27
1159 | 2013-11-07 MIN 34 WAS 27
1160 | 2013-11-10 ATL 10 SEA 33
1161 | 2013-11-10 BAL 20 CIN 17
1162 | 2013-11-10 CHI 19 DET 21
1163 | 2013-11-10 GB 13 PHI 27
1164 | 2013-11-10 IND 8 LAR 38
1165 | 2013-11-10 NYG 24 OAK 20
1166 | 2013-11-10 PIT 23 BUF 10
1167 | 2013-11-10 TEN 27 JAC 29
1168 | 2013-11-10 SF 9 CAR 10
1169 | 2013-11-10 ARI 27 HOU 24
1170 | 2013-11-10 LAC 20 DEN 28
1171 | 2013-11-10 NO 49 DAL 17
1172 | 2013-11-11 TB 22 MIA 19
1173 | 2013-11-14 TEN 27 IND 30
1174 | 2013-11-17 BUF 37 NYJ 14
1175 | 2013-11-17 CHI 23 BAL 20
1176 | 2013-11-17 CIN 41 CLE 20
1177 | 2013-11-17 HOU 23 OAK 28
1178 | 2013-11-17 JAC 14 ARI 27
1179 | 2013-11-17 PHI 24 WAS 16
1180 | 2013-11-17 PIT 37 DET 27
1181 | 2013-11-17 TB 41 ATL 28
1182 | 2013-11-17 MIA 20 LAC 16
1183 | 2013-11-17 NO 23 SF 20
1184 | 2013-11-17 SEA 41 MIN 20
1185 | 2013-11-17 NYG 27 GB 13
1186 | 2013-11-17 DEN 27 KC 17
1187 | 2013-11-18 CAR 24 NE 20
1188 | 2013-11-21 ATL 13 NO 17
1189 | 2013-11-24 BAL 19 NYJ 3
1190 | 2013-11-24 CLE 11 PIT 27
1191 | 2013-11-24 DET 21 TB 24
1192 | 2013-11-24 GB 26 MIN 26
1193 | 2013-11-24 HOU 6 JAC 13
1194 | 2013-11-24 KC 38 LAC 41
1195 | 2013-11-24 MIA 16 CAR 20
1196 | 2013-11-24 LAR 42 CHI 21
1197 | 2013-11-24 ARI 40 IND 11
1198 | 2013-11-24 OAK 19 TEN 23
1199 | 2013-11-24 NYG 21 DAL 24
1200 | 2013-11-24 NE 34 DEN 31
1201 | 2013-11-25 WAS 6 SF 27
1202 | 2013-11-28 DET 40 GB 10
1203 | 2013-11-28 DAL 31 OAK 24
1204 | 2013-11-28 BAL 22 PIT 20
1205 | 2013-12-01 CAR 27 TB 6
1206 | 2013-12-01 CLE 28 JAC 32
1207 | 2013-12-01 IND 22 TEN 14
1208 | 2013-12-01 MIN 23 CHI 20
1209 | 2013-12-01 NYJ 3 MIA 23
1210 | 2013-12-01 PHI 24 ARI 21
1211 | 2013-12-01 HOU 31 NE 34
1212 | 2013-12-01 BUF 31 ATL 34
1213 | 2013-12-01 SF 23 LAR 13
1214 | 2013-12-01 KC 28 DEN 35
1215 | 2013-12-01 LAC 10 CIN 17
1216 | 2013-12-01 WAS 17 NYG 24
1217 | 2013-12-02 SEA 34 NO 7
1218 | 2013-12-05 JAC 27 HOU 20
1219 | 2013-12-08 BAL 29 MIN 26
1220 | 2013-12-08 CIN 42 IND 28
1221 | 2013-12-08 NE 27 CLE 26
1222 | 2013-12-08 NYJ 37 OAK 27
1223 | 2013-12-08 PHI 34 DET 20
1224 | 2013-12-08 PIT 28 MIA 34
1225 | 2013-12-08 TB 27 BUF 6
1226 | 2013-12-08 WAS 10 KC 45
1227 | 2013-12-08 GB 22 ATL 21
1228 | 2013-12-08 DEN 51 TEN 28
1229 | 2013-12-08 ARI 30 LAR 10
1230 | 2013-12-08 LAC 37 NYG 14
1231 | 2013-12-08 SF 19 SEA 17
1232 | 2013-12-08 NO 31 CAR 13
1233 | 2013-12-09 CHI 45 DAL 28
1234 | 2013-12-12 DEN 20 LAC 27
1235 | 2013-12-15 ATL 27 WAS 26
1236 | 2013-12-15 CLE 31 CHI 38
1237 | 2013-12-15 IND 25 HOU 3
1238 | 2013-12-15 JAC 20 BUF 27
1239 | 2013-12-15 MIA 24 NE 20
1240 | 2013-12-15 MIN 48 PHI 30
1241 | 2013-12-15 NYG 0 SEA 23
1242 | 2013-12-15 TB 14 SF 33
1243 | 2013-12-15 CAR 30 NYJ 20
1244 | 2013-12-15 OAK 31 KC 56
1245 | 2013-12-15 LAR 27 NO 16
1246 | 2013-12-15 TEN 34 ARI 37
1247 | 2013-12-15 DAL 36 GB 37
1248 | 2013-12-15 PIT 30 CIN 20
1249 | 2013-12-16 DET 16 BAL 18
1250 | 2013-12-22 BUF 19 MIA 0
1251 | 2013-12-22 CAR 17 NO 13
1252 | 2013-12-22 CIN 42 MIN 14
1253 | 2013-12-22 HOU 13 DEN 37
1254 | 2013-12-22 JAC 16 TEN 20
1255 | 2013-12-22 KC 7 IND 23
1256 | 2013-12-22 NYJ 24 CLE 13
1257 | 2013-12-22 LAR 23 TB 13
1258 | 2013-12-22 WAS 23 DAL 24
1259 | 2013-12-22 DET 20 NYG 23
1260 | 2013-12-22 SEA 10 ARI 17
1261 | 2013-12-22 GB 31 PIT 38
1262 | 2013-12-22 LAC 26 OAK 13
1263 | 2013-12-22 BAL 7 NE 41
1264 | 2013-12-22 PHI 54 CHI 11
1265 | 2013-12-23 SF 34 ATL 24
1266 | 2013-12-29 ATL 20 CAR 21
1267 | 2013-12-29 CIN 34 BAL 17
1268 | 2013-12-29 IND 30 JAC 10
1269 | 2013-12-29 MIA 7 NYJ 20
1270 | 2013-12-29 MIN 14 DET 13
1271 | 2013-12-29 NYG 20 WAS 6
1272 | 2013-12-29 PIT 20 CLE 7
1273 | 2013-12-29 TEN 16 HOU 10
1274 | 2013-12-29 CHI 28 GB 33
1275 | 2013-12-29 NE 34 BUF 20
1276 | 2013-12-29 NO 42 TB 17
1277 | 2013-12-29 ARI 20 SF 23
1278 | 2013-12-29 OAK 14 DEN 34
1279 | 2013-12-29 LAC 27 KC 24
1280 | 2013-12-29 SEA 27 LAR 9
1281 | 2013-12-29 DAL 22 PHI 24
1282 | 2014-09-04 SEA 36 GB 16
1283 | 2014-09-07 ATL 37 NO 34
1284 | 2014-09-07 BAL 16 CIN 23
1285 | 2014-09-07 CHI 20 BUF 23
1286 | 2014-09-07 HOU 17 WAS 6
1287 | 2014-09-07 KC 10 TEN 26
1288 | 2014-09-07 MIA 33 NE 20
1289 | 2014-09-07 NYJ 19 OAK 14
1290 | 2014-09-07 PHI 34 JAC 17
1291 | 2014-09-07 PIT 30 CLE 27
1292 | 2014-09-07 LAR 6 MIN 34
1293 | 2014-09-07 DAL 17 SF 28
1294 | 2014-09-07 TB 14 CAR 20
1295 | 2014-09-07 DEN 31 IND 24
1296 | 2014-09-08 DET 35 NYG 14
1297 | 2014-09-08 ARI 18 LAC 17
1298 | 2014-09-11 BAL 26 PIT 6
1299 | 2014-09-14 BUF 29 MIA 10
1300 | 2014-09-14 CAR 24 DET 7
1301 | 2014-09-14 CIN 24 ATL 10
1302 | 2014-09-14 CLE 26 NO 24
1303 | 2014-09-14 MIN 7 NE 30
1304 | 2014-09-14 NYG 14 ARI 25
1305 | 2014-09-14 TEN 10 DAL 26
1306 | 2014-09-14 WAS 41 JAC 10
1307 | 2014-09-14 LAC 30 SEA 21
1308 | 2014-09-14 TB 17 LAR 19
1309 | 2014-09-14 DEN 24 KC 17
1310 | 2014-09-14 GB 31 NYJ 24
1311 | 2014-09-14 OAK 14 HOU 30
1312 | 2014-09-14 SF 20 CHI 28
1313 | 2014-09-15 IND 27 PHI 30
1314 | 2014-09-18 ATL 56 TB 14
1315 | 2014-09-21 BUF 10 LAC 22
1316 | 2014-09-21 CIN 33 TEN 7
1317 | 2014-09-21 CLE 21 BAL 23
1318 | 2014-09-21 DET 19 GB 7
1319 | 2014-09-21 JAC 17 IND 44
1320 | 2014-09-21 NE 16 OAK 9
1321 | 2014-09-21 NO 20 MIN 9
1322 | 2014-09-21 NYG 30 HOU 17
1323 | 2014-09-21 PHI 37 WAS 34
1324 | 2014-09-21 LAR 31 DAL 34
1325 | 2014-09-21 ARI 23 SF 14
1326 | 2014-09-21 MIA 15 KC 34
1327 | 2014-09-21 SEA 26 DEN 20
1328 | 2014-09-21 CAR 19 PIT 37
1329 | 2014-09-22 NYJ 19 CHI 27
1330 | 2014-09-25 WAS 14 NYG 45
1331 | 2014-09-28 BAL 38 CAR 10
1332 | 2014-09-28 CHI 17 GB 38
1333 | 2014-09-28 HOU 23 BUF 17
1334 | 2014-09-28 IND 41 TEN 17
1335 | 2014-09-28 NYJ 17 DET 24
1336 | 2014-09-28 OAK 14 MIA 38
1337 | 2014-09-28 PIT 24 TB 27
1338 | 2014-09-28 LAC 33 JAC 14
1339 | 2014-09-28 MIN 41 ATL 28
1340 | 2014-09-28 SF 26 PHI 21
1341 | 2014-09-28 DAL 38 NO 17
1342 | 2014-09-29 KC 41 NE 14
1343 | 2014-10-02 GB 42 MIN 10
1344 | 2014-10-05 CAR 31 CHI 24
1345 | 2014-10-05 DAL 20 HOU 17
1346 | 2014-10-05 DET 14 BUF 17
1347 | 2014-10-05 IND 20 BAL 13
1348 | 2014-10-05 JAC 9 PIT 17
1349 | 2014-10-05 NO 37 TB 31
1350 | 2014-10-05 NYG 30 ATL 20
1351 | 2014-10-05 PHI 34 LAR 28
1352 | 2014-10-05 TEN 28 CLE 29
1353 | 2014-10-05 DEN 41 ARI 20
1354 | 2014-10-05 LAC 31 NYJ 0
1355 | 2014-10-05 SF 22 KC 17
1356 | 2014-10-05 NE 43 CIN 17
1357 | 2014-10-06 WAS 17 SEA 27
1358 | 2014-10-09 HOU 28 IND 33
1359 | 2014-10-12 BUF 22 NE 37
1360 | 2014-10-12 CIN 37 CAR 37
1361 | 2014-10-12 CLE 31 PIT 10
1362 | 2014-10-12 MIA 24 GB 27
1363 | 2014-10-12 MIN 3 DET 17
1364 | 2014-10-12 NYJ 17 DEN 31
1365 | 2014-10-12 TB 17 BAL 48
1366 | 2014-10-12 TEN 16 JAC 14
1367 | 2014-10-12 OAK 28 LAC 31
1368 | 2014-10-12 ATL 13 CHI 27
1369 | 2014-10-12 ARI 30 WAS 20
1370 | 2014-10-12 SEA 23 DAL 30
1371 | 2014-10-12 PHI 27 NYG 0
1372 | 2014-10-13 LAR 17 SF 31
1373 | 2014-10-16 NE 27 NYJ 25
1374 | 2014-10-19 BAL 29 ATL 7
1375 | 2014-10-19 BUF 17 MIN 16
1376 | 2014-10-19 CHI 14 MIA 27
1377 | 2014-10-19 DET 24 NO 23
1378 | 2014-10-19 GB 38 CAR 17
1379 | 2014-10-19 IND 27 CIN 0
1380 | 2014-10-19 JAC 24 CLE 6
1381 | 2014-10-19 LAR 28 SEA 26
1382 | 2014-10-19 WAS 19 TEN 17
1383 | 2014-10-19 LAC 20 KC 23
1384 | 2014-10-19 DAL 31 NYG 21
1385 | 2014-10-19 OAK 13 ARI 24
1386 | 2014-10-19 DEN 42 SF 17
1387 | 2014-10-20 PIT 30 HOU 23
1388 | 2014-10-23 DEN 35 LAC 21
1389 | 2014-10-26 CAR 9 SEA 13
1390 | 2014-10-26 CIN 27 BAL 24
1391 | 2014-10-26 JAC 13 MIA 27
1392 | 2014-10-26 KC 34 LAR 7
1393 | 2014-10-26 NE 51 CHI 23
1394 | 2014-10-26 NYJ 23 BUF 43
1395 | 2014-10-26 TB 13 MIN 19
1396 | 2014-10-26 TEN 16 HOU 30
1397 | 2014-10-26 ARI 24 PHI 20
1398 | 2014-10-26 CLE 23 OAK 13
1399 | 2014-10-26 PIT 51 IND 34
1400 | 2014-10-26 NO 44 GB 23
1401 | 2014-10-26 ATL 21 DET 22
1402 | 2014-10-27 DAL 17 WAS 20
1403 | 2014-10-30 CAR 10 NO 28
1404 | 2014-11-02 CIN 33 JAC 23
1405 | 2014-11-02 CLE 22 TB 17
1406 | 2014-11-02 DAL 17 ARI 28
1407 | 2014-11-02 HOU 21 PHI 31
1408 | 2014-11-02 KC 24 NYJ 10
1409 | 2014-11-02 MIA 37 LAC 0
1410 | 2014-11-02 MIN 29 WAS 26
1411 | 2014-11-02 SF 10 LAR 13
1412 | 2014-11-02 NE 43 DEN 21
1413 | 2014-11-02 SEA 30 OAK 24
1414 | 2014-11-02 PIT 43 BAL 23
1415 | 2014-11-03 NYG 24 IND 40
1416 | 2014-11-06 CIN 3 CLE 24
1417 | 2014-11-09 BAL 21 TEN 7
1418 | 2014-11-09 BUF 13 KC 17
1419 | 2014-11-09 DET 20 MIA 16
1420 | 2014-11-09 JAC 17 DAL 31
1421 | 2014-11-09 NO 24 SF 27
1422 | 2014-11-09 NYJ 20 PIT 13
1423 | 2014-11-09 TB 17 ATL 27
1424 | 2014-11-09 OAK 17 DEN 41
1425 | 2014-11-09 ARI 31 LAR 14
1426 | 2014-11-09 SEA 38 NYG 17
1427 | 2014-11-09 GB 55 CHI 14
1428 | 2014-11-10 PHI 45 CAR 21
1429 | 2014-11-13 MIA 22 BUF 9
1430 | 2014-11-16 CAR 17 ATL 19
1431 | 2014-11-16 CHI 21 MIN 13
1432 | 2014-11-16 CLE 7 HOU 23
1433 | 2014-11-16 KC 24 SEA 20
1434 | 2014-11-16 NO 10 CIN 27
1435 | 2014-11-16 NYG 10 SF 16
1436 | 2014-11-16 LAR 22 DEN 7
1437 | 2014-11-16 WAS 7 TB 27
1438 | 2014-11-16 LAC 13 OAK 6
1439 | 2014-11-16 GB 53 PHI 20
1440 | 2014-11-16 ARI 14 DET 6
1441 | 2014-11-16 IND 20 NE 42
1442 | 2014-11-17 TEN 24 PIT 27
1443 | 2014-11-20 OAK 24 KC 20
1444 | 2014-11-23 ATL 24 CLE 26
1445 | 2014-11-23 CHI 21 TB 13
1446 | 2014-11-23 HOU 13 CIN 22
1447 | 2014-11-23 IND 23 JAC 3
1448 | 2014-11-23 MIN 21 GB 24
1449 | 2014-11-23 NE 34 DET 9
1450 | 2014-11-23 PHI 43 TEN 24
1451 | 2014-11-23 LAC 27 LAR 24
1452 | 2014-11-23 SEA 19 ARI 3
1453 | 2014-11-23 DEN 39 MIA 36
1454 | 2014-11-23 SF 17 WAS 13
1455 | 2014-11-23 BUF 38 NYJ 3
1456 | 2014-11-23 NYG 28 DAL 31
1457 | 2014-11-24 NO 27 BAL 34
1458 | 2014-11-27 DET 34 CHI 17
1459 | 2014-11-27 DAL 10 PHI 33
1460 | 2014-11-27 SF 3 SEA 19
1461 | 2014-11-30 BAL 33 LAC 34
1462 | 2014-11-30 BUF 26 CLE 10
1463 | 2014-11-30 HOU 45 TEN 21
1464 | 2014-11-30 IND 49 WAS 27
1465 | 2014-11-30 JAC 25 NYG 24
1466 | 2014-11-30 MIN 31 CAR 13
1467 | 2014-11-30 PIT 32 NO 35
1468 | 2014-11-30 LAR 52 OAK 0
1469 | 2014-11-30 TB 13 CIN 14
1470 | 2014-11-30 ATL 29 ARI 18
1471 | 2014-11-30 GB 26 NE 21
1472 | 2014-11-30 KC 16 DEN 29
1473 | 2014-12-01 NYJ 13 MIA 16
1474 | 2014-12-04 CHI 28 DAL 41
1475 | 2014-12-07 CIN 21 PIT 42
1476 | 2014-12-07 CLE 24 IND 25
1477 | 2014-12-07 DET 34 TB 17
1478 | 2014-12-07 JAC 13 HOU 27
1479 | 2014-12-07 MIA 13 BAL 28
1480 | 2014-12-07 MIN 30 NYJ 24
1481 | 2014-12-07 NO 10 CAR 41
1482 | 2014-12-07 TEN 7 NYG 36
1483 | 2014-12-07 WAS 0 LAR 24
1484 | 2014-12-07 ARI 17 KC 14
1485 | 2014-12-07 DEN 24 BUF 17
1486 | 2014-12-07 OAK 24 SF 13
1487 | 2014-12-07 PHI 14 SEA 24
1488 | 2014-12-07 LAC 14 NE 23
1489 | 2014-12-08 GB 43 ATL 37
1490 | 2014-12-11 LAR 6 ARI 12
1491 | 2014-12-14 ATL 20 PIT 27
1492 | 2014-12-14 BAL 20 JAC 12
1493 | 2014-12-14 BUF 21 GB 13
1494 | 2014-12-14 CAR 19 TB 17
1495 | 2014-12-14 CLE 0 CIN 30
1496 | 2014-12-14 DET 16 MIN 14
1497 | 2014-12-14 IND 17 HOU 10
1498 | 2014-12-14 KC 31 OAK 13
1499 | 2014-12-14 NE 41 MIA 13
1500 | 2014-12-14 NYG 24 WAS 13
1501 | 2014-12-14 LAC 10 DEN 22
1502 | 2014-12-14 TEN 11 NYJ 16
1503 | 2014-12-14 SEA 17 SF 7
1504 | 2014-12-14 PHI 27 DAL 38
1505 | 2014-12-15 CHI 15 NO 31
1506 | 2014-12-18 JAC 21 TEN 13
1507 | 2014-12-20 WAS 27 PHI 24
1508 | 2014-12-20 SF 35 LAC 38
1509 | 2014-12-21 CAR 17 CLE 13
1510 | 2014-12-21 CHI 14 DET 20
1511 | 2014-12-21 HOU 25 BAL 13
1512 | 2014-12-21 MIA 37 MIN 35
1513 | 2014-12-21 NO 14 ATL 30
1514 | 2014-12-21 NYJ 16 NE 17
1515 | 2014-12-21 PIT 20 KC 12
1516 | 2014-12-21 TB 3 GB 20
1517 | 2014-12-21 LAR 27 NYG 37
1518 | 2014-12-21 DAL 42 IND 7
1519 | 2014-12-21 OAK 26 BUF 24
1520 | 2014-12-21 ARI 6 SEA 35
1521 | 2014-12-22 CIN 37 DEN 28
1522 | 2014-12-28 ATL 3 CAR 34
1523 | 2014-12-28 BAL 20 CLE 10
1524 | 2014-12-28 GB 30 DET 20
1525 | 2014-12-28 HOU 23 JAC 17
1526 | 2014-12-28 KC 19 LAC 7
1527 | 2014-12-28 MIA 24 NYJ 37
1528 | 2014-12-28 MIN 13 CHI 9
1529 | 2014-12-28 NE 9 BUF 17
1530 | 2014-12-28 NYG 26 PHI 34
1531 | 2014-12-28 PIT 27 CIN 17
1532 | 2014-12-28 TB 20 NO 23
1533 | 2014-12-28 TEN 10 IND 27
1534 | 2014-12-28 WAS 17 DAL 44
1535 | 2014-12-28 DEN 47 OAK 14
1536 | 2014-12-28 SF 20 ARI 17
1537 | 2014-12-28 SEA 20 LAR 6
1538 | 2015-09-10 NE 28 PIT 21
1539 | 2015-09-13 CHI 23 GB 31
1540 | 2015-09-13 LAR 34 SEA 31
1541 | 2015-09-13 JAC 9 CAR 20
1542 | 2015-09-13 WAS 10 MIA 17
1543 | 2015-09-13 BUF 27 IND 14
1544 | 2015-09-13 NYJ 31 CLE 10
1545 | 2015-09-13 HOU 20 KC 27
1546 | 2015-09-13 ARI 31 NO 19
1547 | 2015-09-13 LAC 33 DET 28
1548 | 2015-09-13 DEN 19 BAL 13
1549 | 2015-09-13 OAK 13 CIN 33
1550 | 2015-09-13 TB 14 TEN 42
1551 | 2015-09-13 DAL 27 NYG 26
1552 | 2015-09-14 ATL 26 PHI 24
1553 | 2015-09-14 SF 20 MIN 3
1554 | 2015-09-17 KC 24 DEN 31
1555 | 2015-09-20 CAR 24 HOU 17
1556 | 2015-09-20 BUF 32 NE 40
1557 | 2015-09-20 CIN 24 LAC 19
1558 | 2015-09-20 CLE 28 TEN 14
1559 | 2015-09-20 NYG 20 ATL 24
1560 | 2015-09-20 WAS 24 LAR 10
1561 | 2015-09-20 CHI 23 ARI 48
1562 | 2015-09-20 MIN 26 DET 16
1563 | 2015-09-20 NO 19 TB 26
1564 | 2015-09-20 PIT 43 SF 18
1565 | 2015-09-20 OAK 37 BAL 33
1566 | 2015-09-20 JAC 23 MIA 20
1567 | 2015-09-20 PHI 10 DAL 20
1568 | 2015-09-20 GB 27 SEA 17
1569 | 2015-09-21 IND 7 NYJ 20
1570 | 2015-09-24 NYG 32 WAS 21
1571 | 2015-09-27 DAL 28 ATL 39
1572 | 2015-09-27 CAR 27 NO 22
1573 | 2015-09-27 NYJ 17 PHI 24
1574 | 2015-09-27 HOU 19 TB 9
1575 | 2015-09-27 MIN 31 LAC 14
1576 | 2015-09-27 LAR 6 PIT 12
1577 | 2015-09-27 NE 51 JAC 17
1578 | 2015-09-27 BAL 24 CIN 28
1579 | 2015-09-27 CLE 20 OAK 27
1580 | 2015-09-27 TEN 33 IND 35
1581 | 2015-09-27 ARI 47 SF 7
1582 | 2015-09-27 SEA 26 CHI 0
1583 | 2015-09-27 MIA 14 BUF 41
1584 | 2015-09-27 DET 12 DEN 24
1585 | 2015-09-28 GB 38 KC 28
1586 | 2015-10-01 PIT 20 BAL 23
1587 | 2015-10-04 MIA 14 NYJ 27
1588 | 2015-10-04 CHI 22 OAK 20
1589 | 2015-10-04 ATL 48 HOU 21
1590 | 2015-10-04 CIN 36 KC 21
1591 | 2015-10-04 IND 16 JAC 13
1592 | 2015-10-04 WAS 23 PHI 20
1593 | 2015-10-04 TB 23 CAR 37
1594 | 2015-10-04 BUF 10 NYG 24
1595 | 2015-10-04 LAC 30 CLE 27
1596 | 2015-10-04 SF 3 GB 17
1597 | 2015-10-04 ARI 22 LAR 24
1598 | 2015-10-04 DEN 23 MIN 20
1599 | 2015-10-04 NO 26 DAL 20
1600 | 2015-10-05 SEA 13 DET 10
1601 | 2015-10-08 HOU 20 IND 27
1602 | 2015-10-11 PHI 39 NO 17
1603 | 2015-10-11 KC 17 CHI 18
1604 | 2015-10-11 CIN 27 SEA 24
1605 | 2015-10-11 ATL 25 WAS 19
1606 | 2015-10-11 TB 38 JAC 31
1607 | 2015-10-11 BAL 30 CLE 33
1608 | 2015-10-11 TEN 13 BUF 14
1609 | 2015-10-11 GB 24 LAR 10
1610 | 2015-10-11 DET 17 ARI 42
1611 | 2015-10-11 DAL 6 NE 30
1612 | 2015-10-11 OAK 10 DEN 16
1613 | 2015-10-11 NYG 30 SF 27
1614 | 2015-10-12 LAC 20 PIT 24
1615 | 2015-10-15 NO 31 ATL 21
1616 | 2015-10-18 DET 37 CHI 34
1617 | 2015-10-18 NYJ 34 WAS 20
1618 | 2015-10-18 PIT 25 ARI 13
1619 | 2015-10-18 MIN 16 KC 10
1620 | 2015-10-18 BUF 21 CIN 34
1621 | 2015-10-18 CLE 23 DEN 26
1622 | 2015-10-18 TEN 10 MIA 38
1623 | 2015-10-18 JAC 20 HOU 31
1624 | 2015-10-18 SEA 23 CAR 27
1625 | 2015-10-18 GB 27 LAC 20
1626 | 2015-10-18 SF 25 BAL 20
1627 | 2015-10-18 IND 27 NE 34
1628 | 2015-10-19 PHI 27 NYG 7
1629 | 2015-10-22 SF 3 SEA 20
1630 | 2015-10-25 JAC 34 BUF 31
1631 | 2015-10-25 LAR 24 CLE 6
1632 | 2015-10-25 MIA 44 HOU 26
1633 | 2015-10-25 NE 30 NYJ 23
1634 | 2015-10-25 KC 23 PIT 13
1635 | 2015-10-25 WAS 31 TB 30
1636 | 2015-10-25 DET 19 MIN 28
1637 | 2015-10-25 IND 21 NO 27
1638 | 2015-10-25 TEN 7 ATL 10
1639 | 2015-10-25 LAC 29 OAK 37
1640 | 2015-10-25 NYG 27 DAL 20
1641 | 2015-10-25 CAR 27 PHI 16
1642 | 2015-10-26 ARI 26 BAL 18
1643 | 2015-10-29 NE 36 MIA 7
1644 | 2015-11-01 KC 45 DET 10
1645 | 2015-11-01 BAL 29 LAC 26
1646 | 2015-11-01 PIT 10 CIN 16
1647 | 2015-11-01 HOU 20 TEN 6
1648 | 2015-11-01 CHI 20 MIN 23
1649 | 2015-11-01 ATL 20 TB 23
1650 | 2015-11-01 NO 52 NYG 49
1651 | 2015-11-01 LAR 27 SF 6
1652 | 2015-11-01 CLE 20 ARI 34
1653 | 2015-11-01 OAK 34 NYJ 20
1654 | 2015-11-01 DAL 12 SEA 13
1655 | 2015-11-01 DEN 29 GB 10
1656 | 2015-11-02 CAR 29 IND 26
1657 | 2015-11-05 CIN 31 CLE 10
1658 | 2015-11-08 MIN 21 LAR 18
1659 | 2015-11-08 CAR 37 GB 29
1660 | 2015-11-08 NE 27 WAS 10
1661 | 2015-11-08 NO 28 TEN 34
1662 | 2015-11-08 BUF 33 MIA 17
1663 | 2015-11-08 NYJ 28 JAC 23
1664 | 2015-11-08 PIT 38 OAK 35
1665 | 2015-11-08 TB 18 NYG 32
1666 | 2015-11-08 SF 17 ATL 16
1667 | 2015-11-08 IND 27 DEN 24
1668 | 2015-11-08 DAL 27 PHI 33
1669 | 2015-11-09 LAC 19 CHI 22
1670 | 2015-11-12 NYJ 17 BUF 22
1671 | 2015-11-15 WAS 47 NO 14
1672 | 2015-11-15 GB 16 DET 18
1673 | 2015-11-15 TB 10 DAL 6
1674 | 2015-11-15 TEN 10 CAR 27
1675 | 2015-11-15 LAR 13 CHI 37
1676 | 2015-11-15 PHI 19 MIA 20
1677 | 2015-11-15 BAL 20 JAC 22
1678 | 2015-11-15 PIT 30 CLE 9
1679 | 2015-11-15 OAK 14 MIN 30
1680 | 2015-11-15 NYG 26 NE 27
1681 | 2015-11-15 DEN 13 KC 29
1682 | 2015-11-15 SEA 32 ARI 39
1683 | 2015-11-16 CIN 6 HOU 10
1684 | 2015-11-19 JAC 19 TEN 13
1685 | 2015-11-22 CHI 15 DEN 17
1686 | 2015-11-22 DET 18 OAK 13
1687 | 2015-11-22 ATL 21 IND 24
1688 | 2015-11-22 HOU 24 NYJ 17
1689 | 2015-11-22 PHI 17 TB 45
1690 | 2015-11-22 CAR 44 WAS 16
1691 | 2015-11-22 MIA 14 DAL 24
1692 | 2015-11-22 BAL 16 LAR 13
1693 | 2015-11-22 LAC 3 KC 33
1694 | 2015-11-22 MIN 13 GB 30
1695 | 2015-11-22 SEA 29 SF 13
1696 | 2015-11-22 ARI 34 CIN 31
1697 | 2015-11-23 NE 20 BUF 13
1698 | 2015-11-26 DET 45 PHI 14
1699 | 2015-11-26 DAL 14 CAR 33
1700 | 2015-11-26 GB 13 CHI 17
1701 | 2015-11-29 WAS 20 NYG 14
1702 | 2015-11-29 ATL 10 MIN 20
1703 | 2015-11-29 CIN 31 LAR 7
1704 | 2015-11-29 HOU 24 NO 6
1705 | 2015-11-29 IND 25 TB 12
1706 | 2015-11-29 NYJ 38 MIA 20
1707 | 2015-11-29 JAC 25 LAC 31
1708 | 2015-11-29 TEN 21 OAK 24
1709 | 2015-11-29 KC 30 BUF 22
1710 | 2015-11-29 SF 13 ARI 19
1711 | 2015-11-29 SEA 39 PIT 30
1712 | 2015-11-29 DEN 30 NE 24
1713 | 2015-11-30 CLE 27 BAL 33
1714 | 2015-12-03 DET 23 GB 27
1715 | 2015-12-06 NYG 20 NYJ 23
1716 | 2015-12-06 BUF 30 HOU 21
1717 | 2015-12-06 MIA 15 BAL 13
1718 | 2015-12-06 CLE 3 CIN 37
1719 | 2015-12-06 TEN 42 JAC 39
1720 | 2015-12-06 CHI 20 SF 26
1721 | 2015-12-06 MIN 7 SEA 38
1722 | 2015-12-06 TB 23 ATL 19
1723 | 2015-12-06 LAR 3 ARI 27
1724 | 2015-12-06 OAK 20 KC 34
1725 | 2015-12-06 LAC 3 DEN 17
1726 | 2015-12-06 NO 38 CAR 41
1727 | 2015-12-06 NE 28 PHI 35
1728 | 2015-12-06 PIT 45 IND 10
1729 | 2015-12-07 WAS 16 DAL 19
1730 | 2015-12-10 ARI 23 MIN 20
1731 | 2015-12-13 PHI 23 BUF 20
1732 | 2015-12-13 NYJ 30 TEN 8
1733 | 2015-12-13 CIN 20 PIT 33
1734 | 2015-12-13 JAC 51 IND 16
1735 | 2015-12-13 KC 10 LAC 3
1736 | 2015-12-13 CHI 21 WAS 24
1737 | 2015-12-13 CAR 38 ATL 0
1738 | 2015-12-13 TB 17 NO 24
1739 | 2015-12-13 LAR 21 DET 14
1740 | 2015-12-13 CLE 24 SF 10
1741 | 2015-12-13 BAL 6 SEA 35
1742 | 2015-12-13 DEN 12 OAK 15
1743 | 2015-12-13 GB 28 DAL 7
1744 | 2015-12-13 HOU 6 NE 27
1745 | 2015-12-14 MIA 24 NYG 31
1746 | 2015-12-17 LAR 31 TB 23
1747 | 2015-12-19 DAL 16 NYJ 19
1748 | 2015-12-20 NYG 35 CAR 38
1749 | 2015-12-20 MIN 38 CHI 17
1750 | 2015-12-20 JAC 17 ATL 23
1751 | 2015-12-20 IND 10 HOU 16
1752 | 2015-12-20 NE 33 TEN 16
1753 | 2015-12-20 BAL 14 KC 34
1754 | 2015-12-20 WAS 35 BUF 25
1755 | 2015-12-20 SEA 30 CLE 13
1756 | 2015-12-20 OAK 20 GB 30
1757 | 2015-12-20 PIT 34 DEN 27
1758 | 2015-12-20 LAC 30 MIA 14
1759 | 2015-12-20 SF 14 CIN 24
1760 | 2015-12-20 PHI 17 ARI 40
1761 | 2015-12-21 NO 27 DET 35
1762 | 2015-12-24 OAK 23 LAC 20
1763 | 2015-12-26 PHI 24 WAS 38
1764 | 2015-12-27 MIA 12 IND 18
1765 | 2015-12-27 NYJ 26 NE 20
1766 | 2015-12-27 TEN 6 HOU 34
1767 | 2015-12-27 KC 17 CLE 13
1768 | 2015-12-27 DET 32 SF 17
1769 | 2015-12-27 ATL 20 CAR 13
1770 | 2015-12-27 TB 21 CHI 26
1771 | 2015-12-27 BUF 16 DAL 6
1772 | 2015-12-27 BAL 20 PIT 17
1773 | 2015-12-27 NO 38 JAC 27
1774 | 2015-12-27 ARI 38 GB 8
1775 | 2015-12-27 SEA 17 LAR 23
1776 | 2015-12-27 MIN 49 NYG 17
1777 | 2015-12-28 DEN 20 CIN 17
1778 | 2016-01-03 BUF 22 NYJ 17
1779 | 2016-01-03 NYG 30 PHI 35
1780 | 2016-01-03 CHI 20 DET 24
1781 | 2016-01-03 ATL 17 NO 20
1782 | 2016-01-03 MIA 20 NE 10
1783 | 2016-01-03 CIN 24 BAL 16
1784 | 2016-01-03 CLE 12 PIT 28
1785 | 2016-01-03 HOU 30 JAC 6
1786 | 2016-01-03 IND 30 TEN 24
1787 | 2016-01-03 DAL 23 WAS 34
1788 | 2016-01-03 CAR 38 TB 10
1789 | 2016-01-03 DEN 27 LAC 20
1790 | 2016-01-03 ARI 6 SEA 36
1791 | 2016-01-03 SF 19 LAR 16
1792 | 2016-01-03 KC 23 OAK 17
1793 | 2016-01-03 GB 13 MIN 20
1794 | 2016-09-08 DEN 21 CAR 20
1795 | 2016-09-11 TEN 16 MIN 25
1796 | 2016-09-11 ATL 24 TB 31
1797 | 2016-09-11 BAL 13 BUF 7
1798 | 2016-09-11 HOU 23 CHI 14
1799 | 2016-09-11 JAC 23 GB 27
1800 | 2016-09-11 KC 33 LAC 27
1801 | 2016-09-11 NO 34 OAK 35
1802 | 2016-09-11 NYJ 22 CIN 23
1803 | 2016-09-11 PHI 29 CLE 10
1804 | 2016-09-11 SEA 12 MIA 10
1805 | 2016-09-11 DAL 19 NYG 20
1806 | 2016-09-11 IND 35 DET 39
1807 | 2016-09-11 ARI 21 NE 23
1808 | 2016-09-12 WAS 16 PIT 38
1809 | 2016-09-12 SF 28 LAR 0
1810 | 2016-09-15 BUF 31 NYJ 37
1811 | 2016-09-18 CAR 46 SF 27
1812 | 2016-09-18 CLE 20 BAL 25
1813 | 2016-09-18 DET 15 TEN 16
1814 | 2016-09-18 HOU 19 KC 12
1815 | 2016-09-18 NE 31 MIA 24
1816 | 2016-09-18 NYG 16 NO 13
1817 | 2016-09-18 PIT 24 CIN 16
1818 | 2016-09-18 WAS 23 DAL 27
1819 | 2016-09-18 ARI 40 TB 7
1820 | 2016-09-18 LAR 9 SEA 3
1821 | 2016-09-18 LAC 38 JAC 14
1822 | 2016-09-18 DEN 34 IND 20
1823 | 2016-09-18 OAK 28 ATL 35
1824 | 2016-09-18 MIN 17 GB 14
1825 | 2016-09-19 CHI 14 PHI 29
1826 | 2016-09-22 NE 27 HOU 0
1827 | 2016-09-25 BUF 33 ARI 18
1828 | 2016-09-25 CAR 10 MIN 22
1829 | 2016-09-25 CIN 17 DEN 29
1830 | 2016-09-25 GB 34 DET 27
1831 | 2016-09-25 JAC 17 BAL 19
1832 | 2016-09-25 MIA 30 CLE 24
1833 | 2016-09-25 NYG 27 WAS 29
1834 | 2016-09-25 TEN 10 OAK 17
1835 | 2016-09-25 SEA 37 SF 18
1836 | 2016-09-25 TB 32 LAR 37
1837 | 2016-09-25 PHI 34 PIT 3
1838 | 2016-09-25 IND 26 LAC 22
1839 | 2016-09-25 KC 24 NYJ 3
1840 | 2016-09-25 DAL 31 CHI 17
1841 | 2016-09-26 NO 32 ATL 45
1842 | 2016-09-29 CIN 22 MIA 7
1843 | 2016-10-02 ATL 48 CAR 33
1844 | 2016-10-02 BAL 27 OAK 28
1845 | 2016-10-02 CHI 17 DET 14
1846 | 2016-10-02 HOU 27 TEN 20
1847 | 2016-10-02 NE 0 BUF 16
1848 | 2016-10-02 NYJ 17 SEA 27
1849 | 2016-10-02 WAS 31 CLE 20
1850 | 2016-10-02 TB 7 DEN 27
1851 | 2016-10-02 ARI 13 LAR 17
1852 | 2016-10-02 LAC 34 NO 35
1853 | 2016-10-02 SF 17 DAL 24
1854 | 2016-10-02 PIT 43 KC 14
1855 | 2016-10-02 JAC 30 IND 27
1856 | 2016-10-03 MIN 24 NYG 10
1857 | 2016-10-06 SF 21 ARI 33
1858 | 2016-10-09 BAL 10 WAS 16
1859 | 2016-10-09 CLE 13 NE 33
1860 | 2016-10-09 DET 24 PHI 23
1861 | 2016-10-09 IND 29 CHI 23
1862 | 2016-10-09 MIA 17 TEN 30
1863 | 2016-10-09 MIN 31 HOU 13
1864 | 2016-10-09 PIT 31 NYJ 13
1865 | 2016-10-09 DEN 16 ATL 23
1866 | 2016-10-09 DAL 28 CIN 14
1867 | 2016-10-09 LAR 19 BUF 30
1868 | 2016-10-09 OAK 34 LAC 31
1869 | 2016-10-09 GB 23 NYG 16
1870 | 2016-10-10 CAR 14 TB 17
1871 | 2016-10-13 LAC 21 DEN 13
1872 | 2016-10-16 BUF 45 SF 16
1873 | 2016-10-16 CHI 16 JAC 17
1874 | 2016-10-16 DET 31 LAR 28
1875 | 2016-10-16 MIA 30 PIT 15
1876 | 2016-10-16 NE 35 CIN 17
1877 | 2016-10-16 NO 41 CAR 38
1878 | 2016-10-16 NYG 27 BAL 23
1879 | 2016-10-16 TEN 28 CLE 26
1880 | 2016-10-16 WAS 27 PHI 20
1881 | 2016-10-16 OAK 10 KC 26
1882 | 2016-10-16 GB 16 DAL 30
1883 | 2016-10-16 SEA 26 ATL 24
1884 | 2016-10-16 HOU 26 IND 23
1885 | 2016-10-17 ARI 28 NYJ 3
1886 | 2016-10-20 GB 26 CHI 10
1887 | 2016-10-23 CIN 31 CLE 17
1888 | 2016-10-23 DET 20 WAS 17
1889 | 2016-10-23 JAC 16 OAK 33
1890 | 2016-10-23 KC 27 NO 21
1891 | 2016-10-23 MIA 28 BUF 25
1892 | 2016-10-23 NYJ 24 BAL 16
1893 | 2016-10-23 PHI 21 MIN 10
1894 | 2016-10-23 TEN 26 IND 34
1895 | 2016-10-23 ATL 30 LAC 33
1896 | 2016-10-23 SF 17 TB 34
1897 | 2016-10-23 PIT 16 NE 27
1898 | 2016-10-23 ARI 6 SEA 6
1899 | 2016-10-23 LAR 10 NYG 17
1900 | 2016-10-24 DEN 27 HOU 9
1901 | 2016-10-27 TEN 36 JAC 22
1902 | 2016-10-30 BUF 25 NE 41
1903 | 2016-10-30 CLE 28 NYJ 31
1904 | 2016-10-30 HOU 20 DET 13
1905 | 2016-10-30 IND 14 KC 30
1906 | 2016-10-30 NO 25 SEA 20
1907 | 2016-10-30 TB 24 OAK 30
1908 | 2016-10-30 CAR 30 ARI 20
1909 | 2016-10-30 DEN 27 LAC 19
1910 | 2016-10-30 ATL 33 GB 32
1911 | 2016-10-30 DAL 29 PHI 23
1912 | 2016-10-30 CIN 27 WAS 27
1913 | 2016-10-31 CHI 20 MIN 10
1914 | 2016-11-03 TB 28 ATL 43
1915 | 2016-11-06 BAL 21 PIT 14
1916 | 2016-11-06 CLE 10 DAL 35
1917 | 2016-11-06 KC 19 JAC 14
1918 | 2016-11-06 MIA 27 NYJ 23
1919 | 2016-11-06 MIN 16 DET 22
1920 | 2016-11-06 NYG 28 PHI 23
1921 | 2016-11-06 LAR 10 CAR 13
1922 | 2016-11-06 SF 23 NO 41
1923 | 2016-11-06 GB 26 IND 31
1924 | 2016-11-06 LAC 43 TEN 35
1925 | 2016-11-06 OAK 30 DEN 20
1926 | 2016-11-07 SEA 31 BUF 25
1927 | 2016-11-10 BAL 28 CLE 7
1928 | 2016-11-13 CAR 17 KC 20
1929 | 2016-11-13 JAC 21 HOU 24
1930 | 2016-11-13 NO 23 DEN 25
1931 | 2016-11-13 NYJ 6 LAR 9
1932 | 2016-11-13 PHI 24 ATL 15
1933 | 2016-11-13 TB 36 CHI 10
1934 | 2016-11-13 TEN 47 GB 25
1935 | 2016-11-13 WAS 26 MIN 20
1936 | 2016-11-13 LAC 24 MIA 31
1937 | 2016-11-13 ARI 23 SF 20
1938 | 2016-11-13 PIT 30 DAL 35
1939 | 2016-11-13 NE 24 SEA 31
1940 | 2016-11-14 NYG 21 CIN 20
1941 | 2016-11-17 CAR 23 NO 20
1942 | 2016-11-20 CIN 12 BUF 16
1943 | 2016-11-20 CLE 9 PIT 24
1944 | 2016-11-20 DAL 27 BAL 17
1945 | 2016-11-20 DET 26 JAC 19
1946 | 2016-11-20 IND 24 TEN 17
1947 | 2016-11-20 KC 17 TB 19
1948 | 2016-11-20 MIN 30 ARI 24
1949 | 2016-11-20 NYG 22 CHI 16
1950 | 2016-11-20 LAR 10 MIA 14
1951 | 2016-11-20 SF 17 NE 30
1952 | 2016-11-20 SEA 26 PHI 15
1953 | 2016-11-20 WAS 42 GB 24
1954 | 2016-11-21 OAK 27 HOU 20
1955 | 2016-11-24 DET 16 MIN 13
1956 | 2016-11-24 DAL 31 WAS 26
1957 | 2016-11-24 IND 7 PIT 28
1958 | 2016-11-27 ATL 38 ARI 19
1959 | 2016-11-27 BAL 19 CIN 12
1960 | 2016-11-27 BUF 28 JAC 21
1961 | 2016-11-27 CHI 21 TEN 27
1962 | 2016-11-27 CLE 13 NYG 27
1963 | 2016-11-27 HOU 13 LAC 21
1964 | 2016-11-27 MIA 31 SF 24
1965 | 2016-11-27 NO 49 LAR 21
1966 | 2016-11-27 TB 14 SEA 5
1967 | 2016-11-27 OAK 35 CAR 32
1968 | 2016-11-27 NYJ 17 NE 22
1969 | 2016-11-27 DEN 27 KC 30
1970 | 2016-11-28 PHI 13 GB 27
1971 | 2016-12-01 MIN 15 DAL 17
1972 | 2016-12-04 ATL 28 KC 29
1973 | 2016-12-04 BAL 38 MIA 6
1974 | 2016-12-04 CHI 26 SF 6
1975 | 2016-12-04 CIN 32 PHI 14
1976 | 2016-12-04 GB 21 HOU 13
1977 | 2016-12-04 JAC 10 DEN 20
1978 | 2016-12-04 NE 26 LAR 10
1979 | 2016-12-04 NO 13 DET 28
1980 | 2016-12-04 OAK 38 BUF 24
1981 | 2016-12-04 ARI 31 WAS 23
1982 | 2016-12-04 PIT 24 NYG 14
1983 | 2016-12-04 LAC 21 TB 28
1984 | 2016-12-04 SEA 40 CAR 7
1985 | 2016-12-05 NYJ 10 IND 41
1986 | 2016-12-08 KC 21 OAK 13
1987 | 2016-12-11 BUF 20 PIT 27
1988 | 2016-12-11 CAR 28 LAC 16
1989 | 2016-12-11 CLE 10 CIN 23
1990 | 2016-12-11 DET 20 CHI 17
1991 | 2016-12-11 IND 17 HOU 22
1992 | 2016-12-11 JAC 16 MIN 25
1993 | 2016-12-11 MIA 26 ARI 23
1994 | 2016-12-11 PHI 22 WAS 27
1995 | 2016-12-11 TEN 13 DEN 10
1996 | 2016-12-11 SF 17 NYJ 23
1997 | 2016-12-11 TB 16 NO 11
1998 | 2016-12-11 GB 38 SEA 10
1999 | 2016-12-11 LAR 14 ATL 42
2000 | 2016-12-11 NYG 10 DAL 7
2001 | 2016-12-12 NE 30 BAL 23
2002 | 2016-12-15 SEA 24 LAR 3
2003 | 2016-12-17 NYJ 13 MIA 34
2004 | 2016-12-18 BAL 27 PHI 26
2005 | 2016-12-18 BUF 33 CLE 13
2006 | 2016-12-18 CHI 27 GB 30
2007 | 2016-12-18 HOU 21 JAC 20
2008 | 2016-12-18 KC 17 TEN 19
2009 | 2016-12-18 MIN 6 IND 34
2010 | 2016-12-18 NYG 17 DET 6
2011 | 2016-12-18 CIN 20 PIT 24
2012 | 2016-12-18 ARI 41 NO 48
2013 | 2016-12-18 ATL 41 SF 13
2014 | 2016-12-18 DEN 3 NE 16
2015 | 2016-12-18 LAC 16 OAK 19
2016 | 2016-12-18 DAL 26 TB 20
2017 | 2016-12-19 WAS 15 CAR 26
2018 | 2016-12-22 PHI 24 NYG 19
2019 | 2016-12-24 BUF 31 MIA 34
2020 | 2016-12-24 CAR 16 ATL 33
2021 | 2016-12-24 CHI 21 WAS 41
2022 | 2016-12-24 CLE 20 LAC 17
2023 | 2016-12-24 GB 38 MIN 25
2024 | 2016-12-24 JAC 38 TEN 17
2025 | 2016-12-24 NE 41 NYJ 3
2026 | 2016-12-24 OAK 33 IND 25
2027 | 2016-12-24 NO 31 TB 24
2028 | 2016-12-24 LAR 21 SF 22
2029 | 2016-12-24 SEA 31 ARI 34
2030 | 2016-12-24 HOU 12 CIN 10
2031 | 2016-12-25 PIT 31 BAL 27
2032 | 2016-12-25 KC 33 DEN 10
2033 | 2016-12-26 DAL 42 DET 21
2034 | 2017-01-01 CIN 27 BAL 10
2035 | 2017-01-01 IND 24 JAC 20
2036 | 2017-01-01 MIA 14 NE 35
2037 | 2017-01-01 MIN 38 CHI 10
2038 | 2017-01-01 NYJ 30 BUF 10
2039 | 2017-01-01 PHI 27 DAL 13
2040 | 2017-01-01 PIT 27 CLE 24
2041 | 2017-01-01 TB 17 CAR 16
2042 | 2017-01-01 TEN 24 HOU 17
2043 | 2017-01-01 ATL 38 NO 32
2044 | 2017-01-01 WAS 10 NYG 19
2045 | 2017-01-01 DEN 24 OAK 6
2046 | 2017-01-01 LAR 6 ARI 44
2047 | 2017-01-01 LAC 27 KC 37
2048 | 2017-01-01 SF 23 SEA 25
2049 | 2017-01-01 DET 24 GB 31
2050 | 2017-09-07 NE 27 KC 42
2051 | 2017-09-10 CHI 17 ATL 23
2052 | 2017-09-10 CIN 0 BAL 20
2053 | 2017-09-10 CLE 18 PIT 21
2054 | 2017-09-10 DET 35 ARI 23
2055 | 2017-09-10 HOU 7 JAC 29
2056 | 2017-09-10 TEN 16 OAK 26
2057 | 2017-09-10 WAS 17 PHI 30
2058 | 2017-09-10 BUF 21 NYJ 12
2059 | 2017-09-10 LAR 46 IND 9
2060 | 2017-09-10 GB 17 SEA 9
2061 | 2017-09-10 SF 3 CAR 23
2062 | 2017-09-10 DAL 19 NYG 3
2063 | 2017-09-11 MIN 29 NO 19
2064 | 2017-09-11 DEN 24 LAC 21
2065 | 2017-09-14 CIN 9 HOU 13
2066 | 2017-09-17 BAL 24 CLE 10
2067 | 2017-09-17 CAR 9 BUF 3
2068 | 2017-09-17 IND 13 ARI 16
2069 | 2017-09-17 JAC 16 TEN 37
2070 | 2017-09-17 KC 27 PHI 20
2071 | 2017-09-17 NO 20 NE 36
2072 | 2017-09-17 PIT 26 MIN 9
2073 | 2017-09-17 TB 29 CHI 7
2074 | 2017-09-17 LAC 17 MIA 19
2075 | 2017-09-17 OAK 45 NYJ 20
2076 | 2017-09-17 DEN 42 DAL 17
2077 | 2017-09-17 LAR 20 WAS 27
2078 | 2017-09-17 SEA 12 SF 9
2079 | 2017-09-17 ATL 34 GB 23
2080 | 2017-09-18 NYG 10 DET 24
2081 | 2017-09-21 SF 39 LAR 41
2082 | 2017-09-24 BUF 26 DEN 16
2083 | 2017-09-24 CAR 13 NO 34
2084 | 2017-09-24 CHI 23 PIT 17
2085 | 2017-09-24 DET 26 ATL 30
2086 | 2017-09-24 IND 31 CLE 28
2087 | 2017-09-24 MIN 34 TB 17
2088 | 2017-09-24 NE 36 HOU 33
2089 | 2017-09-24 NYJ 20 MIA 6
2090 | 2017-09-24 PHI 27 NYG 24
2091 | 2017-09-24 TEN 33 SEA 27
2092 | 2017-09-24 GB 27 CIN 24
2093 | 2017-09-24 LAC 10 KC 24
2094 | 2017-09-24 WAS 27 OAK 10
2095 | 2017-09-24 JAC 44 BAL 7
2096 | 2017-09-25 ARI 17 DAL 28
2097 | 2017-09-28 GB 35 CHI 14
2098 | 2017-10-01 ATL 17 BUF 23
2099 | 2017-10-01 BAL 9 PIT 26
2100 | 2017-10-01 CLE 7 CIN 31
2101 | 2017-10-01 DAL 30 LAR 35
2102 | 2017-10-01 HOU 57 TEN 14
2103 | 2017-10-01 MIN 7 DET 14
2104 | 2017-10-01 NE 30 CAR 33
2105 | 2017-10-01 NYJ 23 JAC 20
2106 | 2017-10-01 ARI 18 SF 15
2107 | 2017-10-01 LAC 24 PHI 26
2108 | 2017-10-01 TB 25 NYG 23
2109 | 2017-10-01 DEN 16 OAK 10
2110 | 2017-10-01 SEA 46 IND 18
2111 | 2017-10-01 MIA 0 NO 20
2112 | 2017-10-02 KC 29 WAS 20
2113 | 2017-10-05 TB 14 NE 19
2114 | 2017-10-08 CIN 20 BUF 16
2115 | 2017-10-08 CLE 14 NYJ 17
2116 | 2017-10-08 DET 24 CAR 27
2117 | 2017-10-08 IND 26 SF 23
2118 | 2017-10-08 MIA 16 TEN 10
2119 | 2017-10-08 NYG 22 LAC 27
2120 | 2017-10-08 PHI 34 ARI 7
2121 | 2017-10-08 PIT 9 JAC 30
2122 | 2017-10-08 LAR 10 SEA 16
2123 | 2017-10-08 OAK 17 BAL 30
2124 | 2017-10-08 DAL 31 GB 35
2125 | 2017-10-08 HOU 34 KC 42
2126 | 2017-10-09 CHI 17 MIN 20
2127 | 2017-10-12 CAR 23 PHI 28
2128 | 2017-10-15 ATL 17 MIA 20
2129 | 2017-10-15 BAL 24 CHI 27
2130 | 2017-10-15 HOU 33 CLE 17
2131 | 2017-10-15 MIN 23 GB 10
2132 | 2017-10-15 NO 52 DET 38
2133 | 2017-10-15 NYJ 17 NE 24
2134 | 2017-10-15 WAS 26 SF 24
2135 | 2017-10-15 ARI 38 TB 33
2136 | 2017-10-15 JAC 17 LAR 27
2137 | 2017-10-15 KC 13 PIT 19
2138 | 2017-10-15 OAK 16 LAC 17
2139 | 2017-10-15 DEN 10 NYG 23
2140 | 2017-10-16 TEN 36 IND 22
2141 | 2017-10-19 OAK 31 KC 30
2142 | 2017-10-22 BUF 30 TB 27
2143 | 2017-10-22 CHI 17 CAR 3
2144 | 2017-10-22 CLE 9 TEN 12
2145 | 2017-10-22 GB 17 NO 26
2146 | 2017-10-22 IND 0 JAC 27
2147 | 2017-10-22 LAR 33 ARI 0
2148 | 2017-10-22 MIA 31 NYJ 28
2149 | 2017-10-22 MIN 24 BAL 16
2150 | 2017-10-22 PIT 29 CIN 14
2151 | 2017-10-22 SF 10 DAL 40
2152 | 2017-10-22 LAC 21 DEN 0
2153 | 2017-10-22 NYG 7 SEA 24
2154 | 2017-10-22 NE 23 ATL 7
2155 | 2017-10-23 PHI 34 WAS 24
2156 | 2017-10-26 BAL 40 MIA 0
2157 | 2017-10-29 BUF 34 OAK 14
2158 | 2017-10-29 CIN 24 IND 23
2159 | 2017-10-29 NE 21 LAC 13
2160 | 2017-10-29 NO 20 CHI 12
2161 | 2017-10-29 NYJ 20 ATL 25
2162 | 2017-10-29 PHI 33 SF 10
2163 | 2017-10-29 TB 3 CAR 17
2164 | 2017-10-29 SEA 41 HOU 38
2165 | 2017-10-29 WAS 19 DAL 33
2166 | 2017-10-29 DET 15 PIT 20
2167 | 2017-10-29 CLE 16 MIN 33
2168 | 2017-10-30 KC 29 DEN 19
2169 | 2017-11-02 NYJ 34 BUF 21
2170 | 2017-11-05 CAR 20 ATL 17
2171 | 2017-11-05 HOU 14 IND 20
2172 | 2017-11-05 JAC 23 CIN 7
2173 | 2017-11-05 NO 30 TB 10
2174 | 2017-11-05 NYG 17 LAR 51
2175 | 2017-11-05 PHI 51 DEN 23
2176 | 2017-11-05 TEN 23 BAL 20
2177 | 2017-11-05 SF 10 ARI 20
2178 | 2017-11-05 SEA 14 WAS 17
2179 | 2017-11-05 DAL 28 KC 17
2180 | 2017-11-05 MIA 24 OAK 27
2181 | 2017-11-06 GB 17 DET 30
2182 | 2017-11-09 ARI 16 SEA 22
2183 | 2017-11-12 BUF 10 NO 47
2184 | 2017-11-12 CHI 16 GB 23
2185 | 2017-11-12 DET 38 CLE 24
2186 | 2017-11-12 IND 17 PIT 20
2187 | 2017-11-12 JAC 20 LAC 17
2188 | 2017-11-12 TB 15 NYJ 10
2189 | 2017-11-12 TEN 24 CIN 20
2190 | 2017-11-12 WAS 30 MIN 38
2191 | 2017-11-12 LAR 33 HOU 7
2192 | 2017-11-12 ATL 27 DAL 7
2193 | 2017-11-12 SF 31 NYG 21
2194 | 2017-11-12 DEN 16 NE 41
2195 | 2017-11-13 CAR 45 MIA 21
2196 | 2017-11-16 PIT 40 TEN 17
2197 | 2017-11-19 CHI 24 DET 27
2198 | 2017-11-19 CLE 7 JAC 19
2199 | 2017-11-19 GB 0 BAL 23
2200 | 2017-11-19 HOU 31 ARI 21
2201 | 2017-11-19 MIN 24 LAR 7
2202 | 2017-11-19 NO 34 WAS 31
2203 | 2017-11-19 NYG 12 KC 9
2204 | 2017-11-19 LAC 54 BUF 24
2205 | 2017-11-19 DEN 17 CIN 20
2206 | 2017-11-19 OAK 8 NE 33
2207 | 2017-11-19 DAL 9 PHI 37
2208 | 2017-11-20 SEA 31 ATL 34
2209 | 2017-11-23 DET 23 MIN 30
2210 | 2017-11-23 DAL 6 LAC 28
2211 | 2017-11-23 WAS 20 NYG 10
2212 | 2017-11-26 ATL 34 TB 20
2213 | 2017-11-26 CIN 30 CLE 16
2214 | 2017-11-26 IND 16 TEN 20
2215 | 2017-11-26 KC 10 BUF 16
2216 | 2017-11-26 NE 35 MIA 17
2217 | 2017-11-26 NYJ 27 CAR 35
2218 | 2017-11-26 PHI 31 CHI 3
2219 | 2017-11-26 LAR 26 NO 20
2220 | 2017-11-26 SF 13 SEA 24
2221 | 2017-11-26 ARI 27 JAC 24
2222 | 2017-11-26 OAK 21 DEN 14
2223 | 2017-11-26 PIT 31 GB 28
2224 | 2017-11-27 BAL 23 HOU 16
2225 | 2017-11-30 DAL 38 WAS 14
2226 | 2017-12-03 ATL 9 MIN 14
2227 | 2017-12-03 BAL 44 DET 20
2228 | 2017-12-03 BUF 3 NE 23
2229 | 2017-12-03 CHI 14 SF 15
2230 | 2017-12-03 GB 26 TB 20
2231 | 2017-12-03 JAC 30 IND 10
2232 | 2017-12-03 MIA 35 DEN 9
2233 | 2017-12-03 NO 31 CAR 21
2234 | 2017-12-03 NYJ 38 KC 31
2235 | 2017-12-03 TEN 24 HOU 13
2236 | 2017-12-03 LAC 19 CLE 10
2237 | 2017-12-03 ARI 16 LAR 32
2238 | 2017-12-03 OAK 24 NYG 17
2239 | 2017-12-03 SEA 24 PHI 10
2240 | 2017-12-04 CIN 20 PIT 23
2241 | 2017-12-07 ATL 20 NO 17
2242 | 2017-12-10 BUF 13 IND 7
2243 | 2017-12-10 CAR 31 MIN 24
2244 | 2017-12-10 CIN 7 CHI 33
2245 | 2017-12-10 CLE 21 GB 27
2246 | 2017-12-10 HOU 16 SF 26
2247 | 2017-12-10 JAC 30 SEA 24
2248 | 2017-12-10 KC 26 OAK 15
2249 | 2017-12-10 TB 21 DET 24
2250 | 2017-12-10 ARI 12 TEN 7
2251 | 2017-12-10 DEN 23 NYJ 0
2252 | 2017-12-10 LAC 30 WAS 13
2253 | 2017-12-10 LAR 35 PHI 43
2254 | 2017-12-10 NYG 10 DAL 30
2255 | 2017-12-10 PIT 39 BAL 38
2256 | 2017-12-11 MIA 27 NE 20
2257 | 2017-12-14 IND 13 DEN 25
2258 | 2017-12-16 DET 20 CHI 10
2259 | 2017-12-16 KC 30 LAC 13
2260 | 2017-12-17 BUF 24 MIA 16
2261 | 2017-12-17 CAR 31 GB 24
2262 | 2017-12-17 CLE 10 BAL 27
2263 | 2017-12-17 JAC 45 HOU 7
2264 | 2017-12-17 MIN 34 CIN 7
2265 | 2017-12-17 NO 31 NYJ 19
2266 | 2017-12-17 NYG 29 PHI 34
2267 | 2017-12-17 WAS 20 ARI 15
2268 | 2017-12-17 SEA 7 LAR 42
2269 | 2017-12-17 PIT 24 NE 27
2270 | 2017-12-17 SF 25 TEN 23
2271 | 2017-12-17 OAK 17 DAL 20
2272 | 2017-12-18 TB 21 ATL 24
2273 | 2017-12-23 BAL 23 IND 16
2274 | 2017-12-23 GB 0 MIN 16
2275 | 2017-12-24 CAR 22 TB 19
2276 | 2017-12-24 CHI 20 CLE 3
2277 | 2017-12-24 CIN 26 DET 17
2278 | 2017-12-24 KC 29 MIA 13
2279 | 2017-12-24 NE 37 BUF 16
2280 | 2017-12-24 NO 23 ATL 13
2281 | 2017-12-24 NYJ 7 LAC 14
2282 | 2017-12-24 TEN 23 LAR 27
2283 | 2017-12-24 WAS 27 DEN 11
2284 | 2017-12-24 SF 44 JAC 33
2285 | 2017-12-24 ARI 23 NYG 0
2286 | 2017-12-24 DAL 12 SEA 21
2287 | 2017-12-25 HOU 6 PIT 34
2288 | 2017-12-25 PHI 19 OAK 10
2289 | 2017-12-31 ATL 22 CAR 10
2290 | 2017-12-31 BAL 27 CIN 31
2291 | 2017-12-31 DET 35 GB 11
2292 | 2017-12-31 IND 22 HOU 13
2293 | 2017-12-31 MIA 16 BUF 22
2294 | 2017-12-31 MIN 23 CHI 10
2295 | 2017-12-31 NE 26 NYJ 6
2296 | 2017-12-31 NYG 18 WAS 10
2297 | 2017-12-31 PHI 0 DAL 6
2298 | 2017-12-31 PIT 28 CLE 24
2299 | 2017-12-31 TB 31 NO 24
2300 | 2017-12-31 TEN 15 JAC 10
2301 | 2017-12-31 DEN 24 KC 27
2302 | 2017-12-31 LAC 30 OAK 10
2303 | 2017-12-31 LAR 13 SF 34
2304 | 2017-12-31 SEA 24 ARI 26
2305 | 2018-09-06 PHI 18 ATL 12
2306 | 2018-09-09 BAL 47 BUF 3
2307 | 2018-09-09 CLE 21 PIT 21
2308 | 2018-09-09 IND 23 CIN 34
2309 | 2018-09-09 MIA 27 TEN 20
2310 | 2018-09-09 MIN 24 SF 16
2311 | 2018-09-09 NE 27 HOU 20
2312 | 2018-09-09 NO 40 TB 48
2313 | 2018-09-09 NYG 15 JAC 20
2314 | 2018-09-09 LAC 28 KC 38
2315 | 2018-09-09 ARI 6 WAS 24
2316 | 2018-09-09 CAR 16 DAL 8
2317 | 2018-09-09 DEN 27 SEA 24
2318 | 2018-09-09 GB 24 CHI 23
2319 | 2018-09-10 DET 17 NYJ 48
2320 | 2018-09-10 OAK 13 LAR 33
2321 | 2018-09-13 CIN 34 BAL 23
2322 | 2018-09-16 ATL 31 CAR 24
2323 | 2018-09-16 BUF 20 LAC 31
2324 | 2018-09-16 GB 29 MIN 29
2325 | 2018-09-16 NO 21 CLE 18
2326 | 2018-09-16 NYJ 12 MIA 20
2327 | 2018-09-16 PIT 37 KC 42
2328 | 2018-09-16 TB 27 PHI 21
2329 | 2018-09-16 TEN 20 HOU 17
2330 | 2018-09-16 WAS 9 IND 21
2331 | 2018-09-16 LAR 34 ARI 0
2332 | 2018-09-16 SF 30 DET 27
2333 | 2018-09-16 DEN 20 OAK 19
2334 | 2018-09-16 JAC 31 NE 20
2335 | 2018-09-16 DAL 20 NYG 13
2336 | 2018-09-17 CHI 24 SEA 17
2337 | 2018-09-20 CLE 21 NYJ 17
2338 | 2018-09-23 ATL 37 NO 43
2339 | 2018-09-23 BAL 27 DEN 14
2340 | 2018-09-23 CAR 31 CIN 21
2341 | 2018-09-23 HOU 22 NYG 27
2342 | 2018-09-23 JAC 6 TEN 9
2343 | 2018-09-23 KC 38 SF 27
2344 | 2018-09-23 MIA 28 OAK 20
2345 | 2018-09-23 MIN 6 BUF 27
2346 | 2018-09-23 PHI 20 IND 16
2347 | 2018-09-23 WAS 31 GB 17
2348 | 2018-09-23 LAR 35 LAC 23
2349 | 2018-09-23 ARI 14 CHI 16
2350 | 2018-09-23 SEA 24 DAL 13
2351 | 2018-09-23 DET 26 NE 10
2352 | 2018-09-24 TB 27 PIT 30
2353 | 2018-09-27 LAR 38 MIN 31
2354 | 2018-09-30 ATL 36 CIN 37
2355 | 2018-09-30 CHI 48 TB 10
2356 | 2018-09-30 DAL 26 DET 24
2357 | 2018-09-30 GB 22 BUF 0
2358 | 2018-09-30 IND 34 HOU 37
2359 | 2018-09-30 JAC 31 NYJ 12
2360 | 2018-09-30 NE 38 MIA 7
2361 | 2018-09-30 TEN 26 PHI 23
2362 | 2018-09-30 ARI 17 SEA 20
2363 | 2018-09-30 OAK 45 CLE 42
2364 | 2018-09-30 LAC 29 SF 27
2365 | 2018-09-30 NYG 18 NO 33
2366 | 2018-09-30 PIT 14 BAL 26
2367 | 2018-10-01 DEN 23 KC 27
2368 | 2018-10-04 NE 38 IND 24
2369 | 2018-10-07 BUF 13 TEN 12
2370 | 2018-10-07 CAR 33 NYG 31
2371 | 2018-10-07 CIN 27 MIA 17
2372 | 2018-10-07 CLE 12 BAL 9
2373 | 2018-10-07 DET 31 GB 23
2374 | 2018-10-07 KC 30 JAC 14
2375 | 2018-10-07 NYJ 34 DEN 16
2376 | 2018-10-07 PIT 41 ATL 17
2377 | 2018-10-07 LAC 26 OAK 10
2378 | 2018-10-07 PHI 21 MIN 23
2379 | 2018-10-07 SF 18 ARI 28
2380 | 2018-10-07 SEA 31 LAR 33
2381 | 2018-10-07 HOU 19 DAL 16
2382 | 2018-10-08 NO 43 WAS 19
2383 | 2018-10-11 NYG 13 PHI 34
2384 | 2018-10-14 ATL 34 TB 29
2385 | 2018-10-14 CIN 21 PIT 28
2386 | 2018-10-14 CLE 14 LAC 38
2387 | 2018-10-14 HOU 20 BUF 13
2388 | 2018-10-14 MIA 31 CHI 28
2389 | 2018-10-14 MIN 27 ARI 17
2390 | 2018-10-14 NYJ 42 IND 34
2391 | 2018-10-14 OAK 3 SEA 27
2392 | 2018-10-14 WAS 23 CAR 17
2393 | 2018-10-14 DEN 20 LAR 23
2394 | 2018-10-14 DAL 40 JAC 7
2395 | 2018-10-14 TEN 0 BAL 21
2396 | 2018-10-14 NE 43 KC 40
2397 | 2018-10-15 GB 33 SF 30
2398 | 2018-10-18 ARI 10 DEN 45
2399 | 2018-10-21 CHI 31 NE 38
2400 | 2018-10-21 IND 37 BUF 5
2401 | 2018-10-21 JAC 7 HOU 20
2402 | 2018-10-21 KC 45 CIN 10
2403 | 2018-10-21 MIA 21 DET 32
2404 | 2018-10-21 NYJ 17 MIN 37
2405 | 2018-10-21 PHI 17 CAR 21
2406 | 2018-10-21 TB 26 CLE 23
2407 | 2018-10-21 BAL 23 NO 24
2408 | 2018-10-21 WAS 20 DAL 17
2409 | 2018-10-21 SF 10 LAR 39
2410 | 2018-10-21 LAC 20 TEN 19
2411 | 2018-10-22 ATL 23 NYG 20
2412 | 2018-10-25 HOU 42 MIA 23
2413 | 2018-10-28 CAR 36 BAL 21
2414 | 2018-10-28 CHI 24 NYJ 10
2415 | 2018-10-28 CIN 37 TB 34
2416 | 2018-10-28 DET 14 SEA 28
2417 | 2018-10-28 KC 30 DEN 23
2418 | 2018-10-28 NYG 13 WAS 20
2419 | 2018-10-28 PIT 33 CLE 18
2420 | 2018-10-28 OAK 28 IND 42
2421 | 2018-10-28 ARI 18 SF 15
2422 | 2018-10-28 LAR 29 GB 27
2423 | 2018-10-28 MIN 20 NO 30
2424 | 2018-10-28 JAC 18 PHI 24
2425 | 2018-10-29 BUF 6 NE 25
2426 | 2018-11-01 SF 34 OAK 3
2427 | 2018-11-04 BAL 16 PIT 23
2428 | 2018-11-04 BUF 9 CHI 41
2429 | 2018-11-04 CAR 42 TB 28
2430 | 2018-11-04 CLE 21 KC 37
2431 | 2018-11-04 MIA 13 NYJ 6
2432 | 2018-11-04 MIN 24 DET 9
2433 | 2018-11-04 WAS 14 ATL 38
2434 | 2018-11-04 DEN 17 HOU 19
2435 | 2018-11-04 SEA 17 LAC 25
2436 | 2018-11-04 NO 45 LAR 35
2437 | 2018-11-04 NE 31 GB 17
2438 | 2018-11-05 DAL 14 TEN 28
2439 | 2018-11-08 PIT 52 CAR 21
2440 | 2018-11-11 CHI 34 DET 22
2441 | 2018-11-11 CIN 14 NO 51
2442 | 2018-11-11 CLE 28 ATL 16
2443 | 2018-11-11 IND 29 JAC 26
2444 | 2018-11-11 KC 26 ARI 14
2445 | 2018-11-11 NYJ 10 BUF 41
2446 | 2018-11-11 TB 3 WAS 16
2447 | 2018-11-11 TEN 34 NE 10
2448 | 2018-11-11 OAK 6 LAC 20
2449 | 2018-11-11 GB 31 MIA 12
2450 | 2018-11-11 LAR 36 SEA 31
2451 | 2018-11-11 PHI 20 DAL 27
2452 | 2018-11-12 SF 23 NYG 27
2453 | 2018-11-15 SEA 27 GB 24
2454 | 2018-11-18 ATL 19 DAL 22
2455 | 2018-11-18 BAL 24 CIN 21
2456 | 2018-11-18 DET 20 CAR 19
2457 | 2018-11-18 IND 38 TEN 10
2458 | 2018-11-18 NYG 38 TB 35
2459 | 2018-11-18 WAS 21 HOU 23
2460 | 2018-11-18 JAC 16 PIT 20
2461 | 2018-11-18 ARI 21 OAK 23
2462 | 2018-11-18 LAC 22 DEN 23
2463 | 2018-11-18 NO 48 PHI 7
2464 | 2018-11-18 CHI 25 MIN 20
2465 | 2018-11-19 LAR 54 KC 51
2466 | 2018-11-22 DET 16 CHI 23
2467 | 2018-11-22 DAL 31 WAS 23
2468 | 2018-11-22 NO 31 ATL 17
2469 | 2018-11-25 BAL 34 OAK 17
2470 | 2018-11-25 BUF 24 JAC 21
2471 | 2018-11-25 CAR 27 SEA 30
2472 | 2018-11-25 CIN 20 CLE 35
2473 | 2018-11-25 NYJ 13 NE 27
2474 | 2018-11-25 PHI 25 NYG 22
2475 | 2018-11-25 TB 27 SF 9
2476 | 2018-11-25 LAC 45 ARI 10
2477 | 2018-11-25 IND 27 MIA 24
2478 | 2018-11-25 DEN 24 PIT 17
2479 | 2018-11-25 MIN 24 GB 17
2480 | 2018-11-26 HOU 34 TEN 17
2481 | 2018-11-29 DAL 13 NO 10
2482 | 2018-12-02 GB 17 ARI 20
2483 | 2018-12-02 HOU 29 CLE 13
2484 | 2018-12-02 JAC 6 IND 0
2485 | 2018-12-02 MIA 21 BUF 17
2486 | 2018-12-02 NYG 30 CHI 27
2487 | 2018-12-02 TB 24 CAR 17
2488 | 2018-12-02 ATL 16 BAL 26
2489 | 2018-12-02 CIN 10 DEN 24
2490 | 2018-12-02 DET 16 LAR 30
2491 | 2018-12-02 OAK 33 KC 40
2492 | 2018-12-02 TEN 26 NYJ 22
2493 | 2018-12-02 NE 24 MIN 10
2494 | 2018-12-02 SEA 43 SF 16
2495 | 2018-12-02 PIT 30 LAC 33
2496 | 2018-12-03 PHI 28 WAS 13
2497 | 2018-12-06 TEN 30 JAC 9
2498 | 2018-12-09 CLE 26 CAR 20
2499 | 2018-12-09 GB 34 ATL 20
2500 | 2018-12-09 HOU 21 IND 24
2501 | 2018-12-09 KC 27 BAL 24
2502 | 2018-12-09 MIA 34 NE 33
2503 | 2018-12-09 TB 14 NO 28
2504 | 2018-12-09 WAS 16 NYG 40
2505 | 2018-12-09 BUF 23 NYJ 27
2506 | 2018-12-09 LAC 26 CIN 21
2507 | 2018-12-09 SF 20 DEN 14
2508 | 2018-12-09 ARI 3 DET 17
2509 | 2018-12-09 DAL 29 PHI 23
2510 | 2018-12-09 OAK 24 PIT 21
2511 | 2018-12-09 CHI 15 LAR 6
2512 | 2018-12-10 SEA 21 MIN 7
2513 | 2018-12-13 KC 28 LAC 29
2514 | 2018-12-15 NYJ 22 HOU 29
2515 | 2018-12-15 DEN 16 CLE 17
2516 | 2018-12-16 IND 23 DAL 0
2517 | 2018-12-16 JAC 13 WAS 16
2518 | 2018-12-16 BAL 20 TB 12
2519 | 2018-12-16 BUF 14 DET 13
2520 | 2018-12-16 CHI 24 GB 17
2521 | 2018-12-16 CIN 30 OAK 16
2522 | 2018-12-16 ATL 40 ARI 14
2523 | 2018-12-16 MIN 41 MIA 17
2524 | 2018-12-16 NYG 0 TEN 17
2525 | 2018-12-16 SF 26 SEA 23
2526 | 2018-12-16 PIT 17 NE 10
2527 | 2018-12-16 LAR 23 PHI 30
2528 | 2018-12-17 CAR 9 NO 12
2529 | 2018-12-22 TEN 25 WAS 16
2530 | 2018-12-22 LAC 10 BAL 22
2531 | 2018-12-23 MIA 7 JAC 17
2532 | 2018-12-23 CAR 10 ATL 24
2533 | 2018-12-23 CLE 26 CIN 18
2534 | 2018-12-23 DAL 27 TB 20
2535 | 2018-12-23 DET 9 MIN 27
2536 | 2018-12-23 NE 24 BUF 12
2537 | 2018-12-23 NYJ 38 GB 44
2538 | 2018-12-23 IND 28 NYG 27
2539 | 2018-12-23 PHI 32 HOU 30
2540 | 2018-12-23 ARI 9 LAR 31
2541 | 2018-12-23 SF 9 CHI 14
2542 | 2018-12-23 NO 31 PIT 28
2543 | 2018-12-23 SEA 38 KC 31
2544 | 2018-12-24 OAK 27 DEN 14
2545 | 2018-12-30 BUF 42 MIA 17
2546 | 2018-12-30 GB 0 DET 31
2547 | 2018-12-30 HOU 20 JAC 3
2548 | 2018-12-30 NE 38 NYJ 3
2549 | 2018-12-30 NO 14 CAR 33
2550 | 2018-12-30 NYG 35 DAL 36
2551 | 2018-12-30 TB 32 ATL 34
2552 | 2018-12-30 KC 35 OAK 3
2553 | 2018-12-30 MIN 10 CHI 24
2554 | 2018-12-30 PIT 16 CIN 13
2555 | 2018-12-30 WAS 0 PHI 24
2556 | 2018-12-30 DEN 9 LAC 23
2557 | 2018-12-30 LAR 48 SF 32
2558 | 2018-12-30 SEA 27 ARI 24
2559 | 2018-12-30 BAL 26 CLE 24
2560 | 2018-12-30 TEN 17 IND 33
2561 |
--------------------------------------------------------------------------------