Martin Eastwood
@martineastwood.co.uk
Somewhere in the middle of a Venn diagram of machine learning and football / soccer.
http://www.pena.lt/y/blog.html
http://www.pena.lt/y/blog.html
Pinned
Martin Eastwood
@martineastwood.co.uk
· Sep 23
⚽ penaltyblog v1.6.0 is now available!
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
New article: "Shrinkage, Uncertainty, and Son Heung-min: Using Bayesian Methods to Identify Finishing Ability"
which discusses using a Bayesian hierarchical approach to quantifying player finishing ability, with credible intervals to express uncertainty.
pena.lt/y/2025/10/01...
which discusses using a Bayesian hierarchical approach to quantifying player finishing ability, with credible intervals to express uncertainty.
pena.lt/y/2025/10/01...
Shrinkage, Uncertainty, and Son Heung-min: Using Bayesian Methods to Identify Finishing Ability
Why most finishing metrics are flawed and how a Bayesian approach gives us a truer picture of a player's finishing ability...
pena.lt
October 20, 2025 at 4:34 PM
New article: "Shrinkage, Uncertainty, and Son Heung-min: Using Bayesian Methods to Identify Finishing Ability"
which discusses using a Bayesian hierarchical approach to quantifying player finishing ability, with credible intervals to express uncertainty.
pena.lt/y/2025/10/01...
which discusses using a Bayesian hierarchical approach to quantifying player finishing ability, with credible intervals to express uncertainty.
pena.lt/y/2025/10/01...
🎉 penaltyblog v1.6.1 is out!
✨ What's new:
- Python 3.14 support
- scipy 1.16+ compatibility
- Better numerical stability for Negative Binomial model
- New Colab notebook for implied probabilities example
pip install --upgrade penaltyblog
✨ What's new:
- Python 3.14 support
- scipy 1.16+ compatibility
- Better numerical stability for Negative Binomial model
- New Colab notebook for implied probabilities example
pip install --upgrade penaltyblog
October 17, 2025 at 6:54 PM
🎉 penaltyblog v1.6.1 is out!
✨ What's new:
- Python 3.14 support
- scipy 1.16+ compatibility
- Better numerical stability for Negative Binomial model
- New Colab notebook for implied probabilities example
pip install --upgrade penaltyblog
✨ What's new:
- Python 3.14 support
- scipy 1.16+ compatibility
- Better numerical stability for Negative Binomial model
- New Colab notebook for implied probabilities example
pip install --upgrade penaltyblog
Here's how the Premier League table really looks according to Massey Ratings, which account for strength of schedule.
📈 Arsenal (+1.5) & Man City (+1.3) are clear strongest overall
😬 Man Utd (-0.2) rank in the bottom half
📉 West Ham & Forest (-1.2) are worst teams by far
📈 Arsenal (+1.5) & Man City (+1.3) are clear strongest overall
😬 Man Utd (-0.2) rank in the bottom half
📉 West Ham & Forest (-1.2) are worst teams by far
October 7, 2025 at 7:54 PM
Here's how the Premier League table really looks according to Massey Ratings, which account for strength of schedule.
📈 Arsenal (+1.5) & Man City (+1.3) are clear strongest overall
😬 Man Utd (-0.2) rank in the bottom half
📉 West Ham & Forest (-1.2) are worst teams by far
📈 Arsenal (+1.5) & Man City (+1.3) are clear strongest overall
😬 Man Utd (-0.2) rank in the bottom half
📉 West Ham & Forest (-1.2) are worst teams by far
⚽ penaltyblog v1.6.0 is now available!
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
September 23, 2025 at 7:45 PM
⚽ penaltyblog v1.6.0 is now available!
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
📊 MatchFlow updates:
- SQL-style joins for nested football data (left, right, outer, inner, anti)
- Cloud storage support: read/write directly to AWS S3, Google Cloud Storage, and Azure Blob
- Automatic type inference for join keys
pip install penaltyblog
🚀 New article on my blog walking through the latest updates to the penaltyblog python package for football (soccer) analytics & betting
✅ New interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
👉 pena.lt/y/2025/08/14...
✅ New interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
👉 pena.lt/y/2025/08/14...
Penaltyblog v1.5.0: Faster Models, Smarter Queries, and a Sharper Edge
v1.5.0 delivers interactive charts, faster models, upgraded football probability grid, and a powerful Flow query language - all designed to make your analysis sharper and quicker...
pena.lt
August 18, 2025 at 6:07 PM
🚀 New article on my blog walking through the latest updates to the penaltyblog python package for football (soccer) analytics & betting
✅ New interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
👉 pena.lt/y/2025/08/14...
✅ New interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
👉 pena.lt/y/2025/08/14...
🚀 penaltyblog v1.5.0 is here!
✅ Interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
What’s new 👇
✅ Interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
What’s new 👇
August 15, 2025 at 6:53 PM
🚀 penaltyblog v1.5.0 is here!
✅ Interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
What’s new 👇
✅ Interactive pitch plots
✅ 5-10× faster goal models
✅ New Flow query DSL
What’s new 👇
📊 New article on my blog: How Accurate Are Soccer Odds? A Data Dive into 250 Million Betting Lines
🔍 How sharp are different bookmakers?
📈 How accurate are bookmaker's odds?
🎯 Are the odds well-calibrated?
➡️ pena.lt/y/2025/07/16...
🔍 How sharp are different bookmakers?
📈 How accurate are bookmaker's odds?
🎯 Are the odds well-calibrated?
➡️ pena.lt/y/2025/07/16...
How Accurate Are Soccer Odds? A Data Dive into 250 Million Betting Lines
A data-driven deep dive into how accurately bookmakers price global soccer markets...
pena.lt
July 16, 2025 at 6:19 PM
📊 New article on my blog: How Accurate Are Soccer Odds? A Data Dive into 250 Million Betting Lines
🔍 How sharp are different bookmakers?
📈 How accurate are bookmaker's odds?
🎯 Are the odds well-calibrated?
➡️ pena.lt/y/2025/07/16...
🔍 How sharp are different bookmakers?
📈 How accurate are bookmaker's odds?
🎯 Are the odds well-calibrated?
➡️ pena.lt/y/2025/07/16...
🚀 penaltyblog v1.4.0 is out!
Now includes a query plan optimiser for smarter Flow pipelines:
• Optional FlowOptimizer for smart rewrites (optimize=True)
• New .plot_plan() for pipeline viz
• .with_schema() for field validation
• Rolling- and time-based summaries
github.com/martineastwo...
Now includes a query plan optimiser for smarter Flow pipelines:
• Optional FlowOptimizer for smart rewrites (optimize=True)
• New .plot_plan() for pipeline viz
• .with_schema() for field validation
• Rolling- and time-based summaries
github.com/martineastwo...
GitHub - martineastwood/penaltyblog: ⚽ High-performance football analytics toolkit: build data pipelines, scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀
⚽ High-performance football analytics toolkit: build data pipelines, scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀 - martineastwood/penaltyblog
github.com
June 19, 2025 at 7:39 PM
🚀 penaltyblog v1.4.0 is out!
Now includes a query plan optimiser for smarter Flow pipelines:
• Optional FlowOptimizer for smart rewrites (optimize=True)
• New .plot_plan() for pipeline viz
• .with_schema() for field validation
• Rolling- and time-based summaries
github.com/martineastwo...
Now includes a query plan optimiser for smarter Flow pipelines:
• Optional FlowOptimizer for smart rewrites (optimize=True)
• New .plot_plan() for pipeline viz
• .with_schema() for field validation
• Rolling- and time-based summaries
github.com/martineastwo...
🚨 I've updated penaltyblog to v1.3.0
It now ships with matchflow, a new submodule for building streaming data pipelines from nested football JSON (like Statsbomb events).
Composable, lazy, and designed for the way football data actually looks.
github.com/martineastwo...
It now ships with matchflow, a new submodule for building streaming data pipelines from nested football JSON (like Statsbomb events).
Composable, lazy, and designed for the way football data actually looks.
github.com/martineastwo...
GitHub - martineastwood/penaltyblog: ⚽ High-performance football analytics toolkit: build data pipelines, scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀
⚽ High-performance football analytics toolkit: build data pipelines, scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀 - martineastwood/penaltyblog
github.com
May 25, 2025 at 8:00 PM
🚨 I've updated penaltyblog to v1.3.0
It now ships with matchflow, a new submodule for building streaming data pipelines from nested football JSON (like Statsbomb events).
Composable, lazy, and designed for the way football data actually looks.
github.com/martineastwo...
It now ships with matchflow, a new submodule for building streaming data pipelines from nested football JSON (like Statsbomb events).
Composable, lazy, and designed for the way football data actually looks.
github.com/martineastwo...
New article on my blog: why the Ranked Probability Score might be misleading you when evaluating football prediction models - and what to use instead
pena.lt/y/2025/05/01...
#FootballAnalytics #DataScience #RPS
pena.lt/y/2025/05/01...
#FootballAnalytics #DataScience #RPS
Better Metrics for Football Forecasts: Moving Beyond the Ranked Probability Score
Why the Ranked Probability Score might be misleading your football model evaluations, and what to use instead....
pena.lt
May 1, 2025 at 6:19 PM
New article on my blog: why the Ranked Probability Score might be misleading you when evaluating football prediction models - and what to use instead
pena.lt/y/2025/05/01...
#FootballAnalytics #DataScience #RPS
pena.lt/y/2025/05/01...
#FootballAnalytics #DataScience #RPS
New on my blog: Pi Ratings — a football-first alternative to Elo.
✅ Handles draws
✅ Uses score margins
✅ Beats Elo on predictions
Includes code, benchmarks & more:
👉 pena.lt/y/2025/04/14...
✅ Handles draws
✅ Uses score margins
✅ Beats Elo on predictions
Includes code, benchmarks & more:
👉 pena.lt/y/2025/04/14...
Pi Ratings: The Smarter Way to Rank Football Teams
A smarter, football-focused alternative to Elo — using Pi Ratings to track team strength and predict matches...
pena.lt
April 14, 2025 at 4:03 PM
New on my blog: Pi Ratings — a football-first alternative to Elo.
✅ Handles draws
✅ Uses score margins
✅ Beats Elo on predictions
Includes code, benchmarks & more:
👉 pena.lt/y/2025/04/14...
✅ Handles draws
✅ Uses score margins
✅ Beats Elo on predictions
Includes code, benchmarks & more:
👉 pena.lt/y/2025/04/14...
penaltyblog v1.2.0 is released!
✅ Elo Ratings now football-specific (home advantage + draw probabilities)
⚡️ Fast Cython implementations of Ignorance Score & Multiclass Brier Score
📝 Updated docs / examples for Elo, Pi Ratings, RPS & more
github.com/martineastwo...
✅ Elo Ratings now football-specific (home advantage + draw probabilities)
⚡️ Fast Cython implementations of Ignorance Score & Multiclass Brier Score
📝 Updated docs / examples for Elo, Pi Ratings, RPS & more
github.com/martineastwo...
GitHub - martineastwood/penaltyblog: ⚽ High-performance football analytics toolkit: scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀
⚽ High-performance football analytics toolkit: scrape data, model matches, rank teams, and bet smarter | Powered by pena.lt/y/blog 🚀 - martineastwood/penaltyblog
github.com
April 10, 2025 at 8:24 PM
penaltyblog v1.2.0 is released!
✅ Elo Ratings now football-specific (home advantage + draw probabilities)
⚡️ Fast Cython implementations of Ignorance Score & Multiclass Brier Score
📝 Updated docs / examples for Elo, Pi Ratings, RPS & more
github.com/martineastwo...
✅ Elo Ratings now football-specific (home advantage + draw probabilities)
⚡️ Fast Cython implementations of Ignorance Score & Multiclass Brier Score
📝 Updated docs / examples for Elo, Pi Ratings, RPS & more
github.com/martineastwo...
Reposted by Martin Eastwood
[NEW] First blog in a long time!
In which I show a pretty straightforward way to derive teams' attacking and defensive strengths from bookmaker odds.
This method is not only easy to implement, but also very accurate compared to results-based models.
mackayanalytics.nl/2025/04/01/g...
In which I show a pretty straightforward way to derive teams' attacking and defensive strengths from bookmaker odds.
This method is not only easy to implement, but also very accurate compared to results-based models.
mackayanalytics.nl/2025/04/01/g...
April 1, 2025 at 8:28 AM
[NEW] First blog in a long time!
In which I show a pretty straightforward way to derive teams' attacking and defensive strengths from bookmaker odds.
This method is not only easy to implement, but also very accurate compared to results-based models.
mackayanalytics.nl/2025/04/01/g...
In which I show a pretty straightforward way to derive teams' attacking and defensive strengths from bookmaker odds.
This method is not only easy to implement, but also very accurate compared to results-based models.
mackayanalytics.nl/2025/04/01/g...
Looking forward to the Field Of Play Conference today. If you’re there as well today then come over and say hi 👋
March 18, 2025 at 9:50 AM
Looking forward to the Field Of Play Conference today. If you’re there as well today then come over and say hi 👋
⚽ New blog post - which football prediction model is the best?
Poisson, Weibull, or Negative Binomial — each has its strengths and weaknesses. Learn how to optimise them for accurate match predictions using my penaltyblog Python package.
pena.lt/y/2025/03/10...
#FootballAnalytics #DataScience
Poisson, Weibull, or Negative Binomial — each has its strengths and weaknesses. Learn how to optimise them for accurate match predictions using my penaltyblog Python package.
pena.lt/y/2025/03/10...
#FootballAnalytics #DataScience
Football Prediction Models: Which Ones Work the Best?
Comparing football goals models — Poisson, Dixon-Coles, and more — to see which predicts best and how to optimize them...
pena.lt
March 16, 2025 at 7:09 PM
⚽ New blog post - which football prediction model is the best?
Poisson, Weibull, or Negative Binomial — each has its strengths and weaknesses. Learn how to optimise them for accurate match predictions using my penaltyblog Python package.
pena.lt/y/2025/03/10...
#FootballAnalytics #DataScience
Poisson, Weibull, or Negative Binomial — each has its strengths and weaknesses. Learn how to optimise them for accurate match predictions using my penaltyblog Python package.
pena.lt/y/2025/03/10...
#FootballAnalytics #DataScience
penaltyblog v1.1.0 is released!
🔥 250x faster models with Cython
📊 New models: Negative Binomial, Weibull, ZIP & Bivariate
🔢 Pi Ratings System for ranking teams
🔗 Full changelog: penaltyblog.readthedocs.io/en/master/changelog/index.html
#Python #SportsAnalytics #MachineLearning
🔥 250x faster models with Cython
📊 New models: Negative Binomial, Weibull, ZIP & Bivariate
🔢 Pi Ratings System for ranking teams
🔗 Full changelog: penaltyblog.readthedocs.io/en/master/changelog/index.html
#Python #SportsAnalytics #MachineLearning
Changelog — penaltyblog documentation
penaltyblog.readthedocs.io
March 15, 2025 at 8:20 PM
penaltyblog v1.1.0 is released!
🔥 250x faster models with Cython
📊 New models: Negative Binomial, Weibull, ZIP & Bivariate
🔢 Pi Ratings System for ranking teams
🔗 Full changelog: penaltyblog.readthedocs.io/en/master/changelog/index.html
#Python #SportsAnalytics #MachineLearning
🔥 250x faster models with Cython
📊 New models: Negative Binomial, Weibull, ZIP & Bivariate
🔢 Pi Ratings System for ranking teams
🔗 Full changelog: penaltyblog.readthedocs.io/en/master/changelog/index.html
#Python #SportsAnalytics #MachineLearning
@pysport.org Looks like you've got the wrong Martin on your website as the contributor for my penaltyblog python package - opensource.pysport.org/project/pena...
opensource.pysport.org
February 27, 2025 at 8:17 PM
@pysport.org Looks like you've got the wrong Martin on your website as the contributor for my penaltyblog python package - opensource.pysport.org/project/pena...
It's been a while but I've written a new article for my blog looking at how to calculate Expected Threat (xT) in football / soccer analytics using linear algebra.
pena.lt/y/2025/01/08...
#python #DataScience #SoccerAnalytics
pena.lt/y/2025/01/08...
#python #DataScience #SoccerAnalytics
Calculating Expected Threat in Python Using Linear Algebra
This article walks through how to calculate expected threat in Python using linear algebra instead of the original convergence method...
pena.lt
January 8, 2025 at 8:04 PM
It's been a while but I've written a new article for my blog looking at how to calculate Expected Threat (xT) in football / soccer analytics using linear algebra.
pena.lt/y/2025/01/08...
#python #DataScience #SoccerAnalytics
pena.lt/y/2025/01/08...
#python #DataScience #SoccerAnalytics
It's been a while, but I've finally released a new version of my penaltyblog python package that replaces PyMC with Stan for the Bayesian models. This should make it much easier to install, and it will now import much faster too.
github.com/martineastwo...
github.com/martineastwo...
GitHub - martineastwood/penaltyblog: Library from http://pena.lt/y/blog for modelling and working with football (soccer) data
Library from http://pena.lt/y/blog for modelling and working with football (soccer) data - martineastwood/penaltyblog
github.com
December 12, 2024 at 9:59 PM
It's been a while, but I've finally released a new version of my penaltyblog python package that replaces PyMC with Stan for the Bayesian models. This should make it much easier to install, and it will now import much faster too.
github.com/martineastwo...
github.com/martineastwo...
Been meaning to update my penaltyblog python package for a while now but it depends on PyMC for the Bayesian modelling and I can no longer get PyMC's dependencies to install via pip. Ah well, guess it's time to start learning Stan instead.
December 7, 2024 at 9:12 PM
Been meaning to update my penaltyblog python package for a while now but it depends on PyMC for the Bayesian modelling and I can no longer get PyMC's dependencies to install via pip. Ah well, guess it's time to start learning Stan instead.