The other day I stumbled upon this piece of analysis from Gradient Sport, where they look at who the best ball carriers are from an explosiveness point of view. Their finding: Haissem Hassan is the best in La Liga from their data.
The event data I work with doesn't have classifiers for explosive actions or anything related to acceleration — that's tracking data territory. So I thought: can I produce a proxy?
Because explosiveness is something really important in the modern game. It's what allows you to beat your man and create space. And I'd actually worked on something similar before — a proxy for take-ons where the player starts from a near-standstill, built entirely from my event data.
So I tried again, with a slightly different angle: who carries the ball while accelerating the most?
Building the proxy
This is tricky to estimate from event data alone, so I asked Claude to help. Together we produced a Python pipeline that does the following:
1. Calculate movement properties for each action — distance to goal at the start and end of each event, the length of the carry, the angle of movement, and the duration between consecutive events.
2. Estimate instantaneous speed — simply the Euclidean distance of the carry divided by its duration. A rough measure, but a necessary building block.
3. Estimate initial speed before the carry — this is where it gets interesting. Rather than assuming the player starts from zero, we estimate their initial speed based on the previous action's speed, adjusted by three factors:
Time decay: the longer the gap between actions, the more the previous speed "decays" (exponential decay with a 3-second half-life).
Direction change: if the player changes direction sharply, we discount the previous speed — you can't maintain momentum through a 90° turn.
Action type: if the previous action was static (a throw-in, a free kick, a receival), we assume the player was mostly stationary. Semi-static actions like tackles get a partial discount.
4. Calculate proxy acceleration — using a simplified kinematic formula: (2 × current_speed - initial_speed) / duration. This gives us a rough acceleration estimate for each carry, capped at realistic bounds (±7 m/s²).
5. Flag explosive carries — any carry with a proxy acceleration above 3.2 m/s² is flagged as a "sprint acceleration". Below -3.2 m/s² counts as a deceleration.
6. Filter for reliability — we only keep carries where the previous action was something meaningful (a receival, interception, tackle, take-on, dribble, or bad touch), the time gap is under 3 seconds, and the duration is positive. This removes noise from dead balls and data artifacts.
How does it compare?
The results are different from Gradient's — and that's fair. We're trying to replicate their work from an entirely different data type and source. But I'm pretty happy with what came out. Look at this scatter plot - label are incorrect, we have Carries in Final 3rd on the y and Explosive Carries on the x: the outliers in La Liga are pretty much the same as the ones identified by Gradient:

Of course, working with take-ons is slippery because every provider classifies them differently. But the distribution of successful take-ons is quite solid — even though my definition of "successful" here is simply: after the take-on, you keep the ball, no matter what.

I'm also happy with the fact that season on season, the volume of explosive carries per 90 remains stable. That's a good sign — it means the definition we built isn't picking up noise or drifting with sample size.

Who creates the most value from explosive carries?
To wrap it up: which players in La Liga produce the most value with these explosive carries?

What's next
I'm also glad I came across Gradient's post because it pushed me to produce a proxy for effective game time — effective time in possession and out of it. I plan to apply that across all of my work going forward, and most importantly to my radars, which are my primary player evaluation tool right now.
I'll also fold this acceleration definition into my take-ons-from-standstill work, which will be the next piece. So expect an update and a full season recap soon. See you next time!
