Feature Request: Normalized Power Personal Records

I believe I heard @Nate_Pearson talk about Normalized Power Personal Records on the podcast. Any update on this or where it may be on the list of features in development?

I would love to be able to track this aspect of my power as well - particularly as I’ve been pretty happy with my NP on many of my outdoor rides this season!


Hey @John_Barclay!

I just ran this by Jonathan and he said:

Sorry we don’t have anything more definitive right now :confused:.

1 Like

Cool, thanks @Bryce!

1 Like

I’d like this too. It’s a much more CPU intensive calculation and that’s why it wasn’t done with the regular PRs at first.

Question: How short should we calculate NP for? Coggan says don’t show it for anything less than 20 minutes. I feel like people wouldn’t like that. I was thinking 5 minutes.



That seems reasonable to me.

  • Maybe 15 to 30 second blocks from 5 minutes up to 20 minutes?
  • Then 1 minute blocks from 1 hour to 2 hours?
  • Finally 5 minutes after that?
1 Like

This makes sense to me too. Certainly fewer time intervals than average power.

I would actually be fine with starting NP at 20 minutes given Dr. Coggan’s view…but I also agree that many would want to start it earlier, so starting at 5 minutes seem reasonable.

1 Like

Why not per-second PRs? It makes it easier for us to display them if they line up with power PRs.


Whatever is easier for you guys! My assumption that fewer time intervals would be easier to manage, but I clearly have no idea of the back-end implications.

1 Like

Based on the computing issue, I assumed that less would be more manageable.

But if that’s not the case, a 1:1 match on the intervals you have for the AP ones makes perfect sense.

1 Like

Consider adding/superimposing VI?

1 Like

You still have to compute the NP for every second on every workout so you can build your bests. That’s the expensive part.


If the data is there, then let’s get it all.

As they say, “If it’s free… it’s for me!” :stuck_out_tongue:

For record-chart purposes, I think the main thing that limits how short you can compute NP for is the fact that for short time intervals, the 30-second smoothing applied when computing NP starts pulling NP below average power. With some simple test cases, that effect seems to become small somewhere in the vicinity of 6 minutes.

One thing you might want to consider is, instead of showing a graph of NP records, show max(AvgP, NP). That lets you have it be well-behaved at all time scales. Should be easy enough to mock up internally once you have a NP-record graph. You could even come up with your own trademarked term for it. :wink:

They already do that for average power, though. Unless I’m missing something, doing it for normalized power is not significantly more expensive.

This is all guessing on how it’s implemented. I’m justifying their stated position.

From medium the definition of NP:

rolling_average = 30 second rolling average
rolling_avg_powered = rolling_average^4
avg_powered_values = average of rolling_avg_powered
NP = avg_powered_values^0.25

I think if you were to do a strict ‘compute NP for every applicable bin at every second’ it would be overly expensive. You would effectively be forced to re-compute the PB chart for every second of the workout, so all of a sudden computing bests for a 3 hour workout is 11,000x more expensive.

Looking at it it seems like there should be some cheats to make it cheap by not going through the whole algorithm at every point. But I would need to spend time actually implementing it or doing math to show that it’s correct. They don’t pay me enough for that.

I’m still thinking it’s just as expensive as making the PR chart for average power.

Finding the maximum k-second average of a function is O(N), The average-power PR chart for a single ride is the k-second average for every value k. I don’t know offhand if there’s a clever way of making that cheaper than O(N^2). Regardless, TrainerRoad has some algorithm that they use, make_ride_pr_chart, that computes the maximum-averages PR chart R(k) from the ride power function P(t).

Computing the NP PR chart is the same problem. It’s just applied to a different function, Q(t) = [ smooth_30_sec( P(t) ) ]^4. If you apply make_ride_pr_chart to Q(t) instead of P(t), you get the NP PR chart. (After you do x^0.25 on the result.)

1 Like

Was going to ask about this but found this thread- would be a great feature for comparing race efforts on different courses (eg punchy vs flat)