TSS estimate to get "in the green"

It would be helpful to be able to get an estimate of what TSS for the day would be required to get “into the green” on the Fitness graph (Form -10 to -30). This would give you very fine grain control over your workout schedule to get the precise results you want.

I do understand that Form isn’t an exact science and people don’t fall directly on these boundaries, etc. But I think in general I think having this level of control would let you more precisely plan your workouts to fit whatever particular Fitness curve seems to work best for you.

Forgive my brute-force method, but here’s a Python script example which takes the intervals.icu TSS history to calculate what TSS you need for different target Form values:


            def detectTodayTSS(tss_history, form):
                tss_history_copy = tss_history.copy()
                for i in range(4096):
                    tss_history_copy[0] = tss_history_copy[0] + 1
                    fitness_new = pd.DataFrame(reversed(tss_history_copy)).ewm(com=42).mean()
                    fatigue_new = pd.DataFrame(reversed(tss_history_copy)).ewm(com=7).mean()
                    fitness_new = fitness_new.iloc[:, 0].tolist()[::-1]
                    fatigue_new = fatigue_new.iloc[:, 0].tolist()[::-1]
                    form_new = fitness_new[0] - fatigue_new[0]
                    if form_new < form:
                        return i

            metrics = {
                "Maintain": icu_ctl[1] - icu_atl[1],
                "Blue:    5": 5 + sys.float_info.epsilon,
                "Grey:   -5": -5 + sys.float_info.epsilon,
                "Green: -10": -10,
                "Green: -11": -11,
                "Green: -12": -12,
                "Green: -20": -20,
                "Red:   -30": -30,
            }

            todayDate = datetime.datetime.now().date()
            todayTSS = 0

            # create data frame with all metrics
            dataFrame = pd.DataFrame(
                {
                    name: [
                        todayTSS or detectTodayTSS(tss_history, value),
                        detectTodayTSS([todayTSS] + tss_history, value),
                        detectTodayTSS([todayTSS, 0] + tss_history, value),
                    ] for name, value in metrics.items()
                },
                index=[
                    str(todayDate + datetime.timedelta(days=0)),
                    str(todayDate + datetime.timedelta(days=1)),
                    str(todayDate + datetime.timedelta(days=2))
                ],
            )

            print(dataFrame)

When you run this, you get results like this:

            Maintain  Blue:    5  Grey:   -5  Green: -10  Green: -11  Green: -12  Green: -20  Red:   -30
2024-08-27        51           0          66         115         125         135         213         312
2024-08-28        95          12         110         159         169         179         257         356
2024-08-29       132          49         147         196         206         216         295         393

From that little chart, it’s pretty easy to pick out an appropriate workout, especially if you’re using TrainerRoad or Zwift or anything which gives precise TSS workout values.

The manual method is to create a planned workout for the next day and put in a load number (maybe duration is also needed). The activity chart will adjust the drawing. Now you can binary search by hand :slight_smile:

1 Like

Maybe I’m missing something, but TrainingPeaks has a feature that my coach taught me to use when moving days around due to work schedule.

For example these 3 days:

Day 1:

Day 2:

Day 3:

image

In TrainingPeaks that also works with planned workouts.

FWIW in Intervals it is possible here:

1 Like

Hi,
Probably a very basic question.

I normally do 6:1 weeks

If I have a goal to stay at fitness 80, how much TSS do I need to collect each of the training days?
or is it as simple as (7*80)/6=93.3? or are there other factors I need to consider?

I think it is hard for me to find the time to push it much further. Bouncing around 76-78

thx

That would be a nice feature, but it’s way easier to calculate than with your method.
Just use the definitions of Form and Fatigue as exponentially weighted moving averages and you get the following formula:

Load=(Targetform-Form)/(e^(-1/7)-e^(-1/42))

Form is the form for that day before the training, Targetform is the desired form, Load is the training load needed to reach that form.

Example calculation:
Targetform=-30
Form=-2
Load=(-30-(-2))/(e^(-1/7)-e^(-1/42)) ≈255


As you can see in the Screenshots, it works, although it might be off by one sometimes because of rounding errors.

Hello all,

I use a simple Excel sheet that calculates CTL, ATL and From (yes, I mixed terms), Weekly Load and Weekly Ramp using the daily planned load entered in column TSS PLAN. The FORM column is formatted to show the colors as used by Intervals. Also, I always include resting days with a zero load to account for the effect that they have in CTL and FORM.

With it, I plan daily TSS and track FORM in accordance to my objectives, using the load values that will keep me in green, gray or blue depending on the training period I am in and avoid yellow and red.

The first line SUNDAY BB has the data for the last Sunday of the previous block that is used as a starting point. There are 4 weeks as my training is made up of 3 load weeks by one recovery week.
When planning longer training periods I just copy the 4 weeks and paste them below to plan several blocks in a row.

I would be happy to share it with you but the forum does not allow Excel files to be uploaded.

Cheers

Hello all,
I made some changes to improve the Excel worksheet.

At the top, enter the starting Fitness and Fatigue.
In the orange color column, enter the planned load for the day and Fitness, Fatigue and Form will be estimated. The Form colors match those used by Intervals.
I added a periodization structure with Base, Build and Taper periods that can be customized to your needs.

As the forum does not allow Excel files to be uploaded, it is available for free through this link in case you may be interested:

PD: The Load values in the downloadable file were entered for testing purposes and do not reflect an actual training plan. :wink:

1 Like