├── 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 | --------------------------------------------------------------------------------