【Python】自転車ロードレースのパワトレで使うPMCを作った

スポーツ

 

パワーメーターを使ってはじき出される数値を利用して、パフォーマンスマネジャーチャート(PMC)を作ることが出来ます。

 

今回はパワートレーニングバイブルを参考に、TSSとCTLの動向を読み取って練習不足かオーバートレーニング気味か教えてくれるPMCを作成したので紹介します。

 

スポンサーリンク

データを取得する

 

PMCを作成するにはデータが必要です、そしてこれから紹介するツールは1日の練習時間と平均パワー、作成者のFTP(1時間の平均最大パワー)を入力することで作動します。

 

今回はGoldenCheetahのデータを使いますが、Garmin Expressなどのトレーニング管理アプリは大抵エクスポート機能が付いているので、そこから必要な情報を取得するのもアリです。

 

【参考記事】自転車トレーニングのデータをGoldenCheetahで管理

 

そしてこういったcsvデータが取得できました。

 

 

このファイルの名前をtrainingdata.csvとしましょう。

 

コードを書く

 

さっき取得したcsvデータを使ってコードを書いていきます。

 

そして出来上がったのがこれです、

 

import pandas as pd
import matplotlib.pyplot as plt

# training_data読み込み
df = pd.read_csv("trainingdata.csv", encoding="utf-8")
time_list = list(df["time_riding"])
np_list = list(df["coggan_np"])
ftp = int(input("Your FTP: "))

ctl = []
atl = []
tsb = []

# 値を計算、おのおのリストに加える
for i in range(len(time_list)):
    intensity_factor = np_list[i] / ftp
    tss = (((time_list[i] / 3600) * np_list[i] * intensity_factor) / ftp) * 100

    if len(ctl) == 0:
        ctl_segment = 1 * 0.976 + tss * (1 - 0.976)
        atl_segment = 1 * 0.867 + tss * (1 - 0.867)
        tsb_segment = 1 - 1
        ctl.append(ctl_segment)
        atl.append(atl_segment)
        tsb.append(tsb_segment)
    else:
        ctl_segment = ctl[i - 1] * 0.976 + tss * (1 - 0.976)
        atl_segment = atl[i-1] * 0.867 + tss * (1-0.867)
        tsb_segment = ctl[i-1] - atl[i-1]
        ctl.append(ctl_segment)
        atl.append(atl_segment)
        tsb.append(tsb_segment)

# 練習不足、オーバートレーニング定義
if atl[-1] - atl[-7] <= 70:
    print("ここ一週間オーバーワーク気味だね、休息日を増やそう。")
elif ctl[-1] - ctl[-42] <= 28:
    print("ここ一ヶ月オーバーワーク気味だね、休息日を増やそう。")
elif ctl[-1] - ctl[-14] >= 5:
    print("ここ一週間ほど練習量が足りないね、TSS100を目安に頑張ろう。")

# グラフに表示、コメントに表示
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(ctl, c="b")
plt.plot(atl, c="r")
plt.plot(tsb, c="g")
plt.savefig("PMC.png")
plt.show()

 

1. トレーニングデータ読み込み

 

pandasをつかってcsvデータを読み込みます。

 

今回のシステムで必要なのはトレーニング時間とNP(平均パワーでも可)なので、その情報を抜き出してリストを作成します。

 

2. リストを作成

 

次に、CTL、 ATL、 TSBのグラフを作るためにリストを作成します。

 

ちなみにTSS、CTL、ATL、TSBはそれぞれ以下をざっくり意味します。

 

TSS = トレーニング強度を示す

CTL = 長期トレーニング負荷「体力」に近い意味

ATL = 短期トレーング負荷「疲労」に近い意味

TSB = トレーニング・ストレス・バランス、「どのくらい元気な状態か?」を示す

 

3. トレーニング毎のCTL, ATL, TSBを計算

 

csvデータを一行ずつ読み込んでトレーニング毎のCTL、ATL、TSBを計算、それぞれリストに加えます。

 

また、上記の値を計算するのに必要なため、TSSとIF(強度係数)も一緒に計算します。

 

TSS、IF、CTL、ATL、TSBは以下の計算式で導きます。

 

TSS = { ( TIME × NP × IF ) ÷ FTP } × 100

IF =  NP ÷ FTP

CTL = 前日のCTL × EXP(-1/42) + TSS × {1-EXP(-1/42)}

ATL = 前日のATL × EXP(-1/7) + TSS × {1-EXP(-1/7)}

TSB = 前日のCTL – 前日のATL

 

CTL、ATL、TBSはそれぞれ前日のデータが必要です。しかし、初めて測定を開始した日より前のデータは無いので、測定初日よりさらに一日前をバーチャルで作ります。その日はCTLとATLが1になる分だけ練習した(実質的にはしていない)ということにします。

 

なお、EXP(-1/7)とEXP(-1/42)はそれぞれ0.976、0.867にしています。

 

これでグラフに表す分のCTL、ATL、TSBのリストを作成することに成功しました。

 

4. 練習量を定義して不足か過足か知らせる

 

いくらグラフを作成しても、グラフの意味が理解できなければ宝の持ち腐れです。

 

そこで、パワトレ初心者でも簡単に利用できるようにCTLとATLの動向を読み取って「練習が足りていないか、オーバーワーク気味か」を教えてくれるプログラムを組み込みます

 

パワートレーニングバイブルを参考に、練習不足とオーバーワークを以下のように定義しました。

 

練習不足 = 直近2週間のCTLの差が5より上がっていない

オーバーワーク = 直近42日のCTLの差が28より大きい or 直近1週間のATLの差が70より大きい

 

これで、CTLとATLが上記の3つの定義に該当した場合、練習不足かオーバーワークかをprint()で知らせてくれます。

 

5. グラフとして表示

 

あとはmatplotlibでグラフを表示するだけです。

 

その結果がこちら、

 

 

3つの指標はそれぞれ、CTL=青、ATL=赤、TSB=緑で表示され、y軸が数値、x軸が日数を表しています。

 

まとめ

 

以上、パーフォーマンスマネジャーチャートの作り方の紹介でした。

 

このツールの良い部分は「練習不足か、オーバーワーク気味か」を教えてくれることです。

 

パワートレーニングを初めて間もない方はPMCを作っても意味を理解していない事が多く、なんとなく理解しても、

 

とりまCTLを上げまくったらええんやろ?

 

と考えてしまいがちですが、こういったツールを使えば最適な練習強度でトレーニングを続けることが出来るでしょう。