【Python】スキーターンの変曲点探し作業記録<pythonデータ処理タイパ凄い>

過去3年のノウハウで、スキーターンの変曲点(ニュートラルポイント=ターンが終了して次のターンへ始動するポイント)
を見つけることが、スキーターン解析のスタート地点であることが判ってます。
しかし、膨大なデータからニュートラルポイントを抽出して、それが、すべて理論とあっているか確認するのができてませんでした。

●EXCELとかC#のPgmで面倒すぎて今まで出来なかったことがPythonなら学習しながら2日で出来た
C#、Excelでやると、データの前処理から計算してグラフまで大変手間取るので、今までは1-2本の滑走データを解析するのが精一杯でした。特に、データ内に欠落、異常値がある場合、C#だとエラーだらけになってエラー処理の沼にはまってしまって、変曲点までたどりつくのが非常に時間がかかって1か月くらいかかることがありました。
しかし、Pythonだと、pandas でデータの前処理、欠落対策が簡単に出来るし、
変曲点探しは、pandasの演算機能で数行で片付いてしまうので、最後にmatplotlibも自動グラフ機能が凄く効いていて、劇的にデータ解析の生産性があがりました。
●スキー変曲点の原理
スキーは、進行方向と板の方向が一致していればズレ無しで切れた滑りができてます。
進行方向と板の方向にズレが生じているとズラしているということになります。
パラレルターンの切り替えでは、必ずニュートラルポイントという切り替え点を通過します。
ニュートラルポイントの特徴は、板の進行方向(headMot角)
と板の方向(Heading角)が一致するのと、板の角付け角がゼロ点になります。このニュートラルポイント(変曲点)を最初に導出してからスキーデータの解析が始まります。

●変曲点探し作業順序
1)生データのCSVから、headMot角(進行ベクトルの方角)とHeading角(スキー板の方角)をデータをそろえる作業
RTKの角度は、0.00001度を1と表しているので、角度値に
0.00001を掛け算して通常の角度に換算します。
1-1:データ列をif文で、場合分けして計算
Heading角は、MovingBaseで180度逆方向なので、180度足してから360度超えた分はif文で<360以上なら360引くという処理をします。
この処理を全行するのにEXCELだとセルを埋めるドラッグ操作が必要です。これが数千から数万行となると何十秒もかかります。
  padas DataFrameだと、if文で列を処理するコマンドがたくさんあって下記の1行で、片付いてしまいます。

df[“Heading360”] = df.relPosHeading_R.multiply(0.00001)+180
df[“Heading360”] = np.where(df[“Heading360”] > 360, df[“Heading360”] – 360, df[“Heading360”])

1-2:headMotの変動が激しいので、3点の移動平均をかけます。
 rolling()というコマンドが用意されて、列内でループ回す計算処理を一行でやってくれます。
下記の1行でheadMot360列を3回移動平均計算をしてheadMotMA3列を新たに作成して代入してくれます。

df["headMotMA3"]=df["headMot360"].rolling(3).mean()

1-3:均されたhedMotMA3で差分をとって、極値を探す
     これもdiff()というコマンドがあって1行で差分計算してくれます。


df[“headMotMA3diff”]=df[“headMotMA3”].diff()

2)グラフにしてみて、たくさんの滑走データで変曲点を確認してみる
2-1:matplotlibの入門時点での注意点
matplotlibの使い方で、pltとオブジェクトとして使う方法があるそうですが、細かなことをやりだすとオブジェクトが必要なので

最初からオブジェクトを使ってプロットしたほうが良いそうです。

 ということで、matplotlibを検索しまくって、良い解説記事をみつけたので、記録しておきます。
作者の方には感謝です。

早く知っておきたかったmatplotlibの基礎知識、あるいは見た目の調整が捗るArtistの話

matplotlib基礎 | figureやaxesでのグラフのレイアウト

2-2 まずは1個のグラフ
figというウィンドウを作ってその中にグラフ(axes)を複数個作ることができますが、はじめは1個だけでやってみました。

●グラフの見方
左縦軸が角度、右軸が差分 横軸がindex番号(itow120msec毎のデータ)

プロットしたのはheadMot(赤)とHeading(青)と差分diff(黒)と差分がゼロとなる極値を縦線(水色)です。極値縦線がheadMot線とHeading線と重なったポイントがニュートラルポイントです。スキー板の方向と進行方向がぴったり合った瞬間です。このデータは右足のデータななので、右足が外足(谷足)になるターンで、ニュートラルが明確に表れてます。

#******************************plot*************************************************************************

fig, ax = plt.subplots(figsize=(12, 10))# 12inch x10inchのウィンドを作る
fig.suptitle(basename)#CSVファイル名をタイトルにする

#graph1
ax.plot(result.index, result.headMot360, "red",label= "headMot360")  # Graph2  headMot
ax.plot(result.index, result.Heading360, "blue", label="Heading360")  # Graph2 Heading
ax2 = ax.twinx()#2軸にdiff差分プロット 作成
ax2.plot(result.index, result.headMotMA3diff, "black", label="headMotMA3diff")  # Graph3  headMotMA3diff
ax2.grid()
#縦線で差分ゼロ交点を指摘
for i in range(2,len(result.index)):
    if result.loc[i,"headMotMA3diff"]*result.loc[i-1,"headMotMA3diff"] <0:
            ax2.axvline(i,color="aqua")

ax.legend(loc="upper left")#凡例
ax2.legend(loc="center left")
#ax2.legend()

plt.show()#プロット実行 これないとグラフ書かない

この結果が下図です。

★これだけだと、細かな点が見えないので、拡大できないかとみると、左下に虫眼鏡マークがあります。これをクリックすると
カーソルが十字カーソルになるので、十字カーソルで拡大したい部分の四角を書くと、なんと下図のように拡大できます。
拡大から元に戻すには、左矢印をクリックすると順にもどっていくし、進めたかったら、右矢印で拡大画像を何度でも観られます。
この機能デフォルトでmatplotlibについているので、超便利です。
400-750番目まで拡大

750-1200番目まで拡大

 

●この数行のプログラムで、3月15日の右足MBデータの変曲点チェックが完了できました。プログラム学習から2日で完成です。

 

●感想
Python pandasとmatplotlibは、データ解析には必須のツールであることを実感しました。
=>私は、退職した技術者ですが、現役の方で、データを大量に扱うお仕事をしてる方は、Python使えないと、使える人と生産性が2桁違いになるので
給料の差になるほどの差がでますので、学習するのは、技術者であるための必然となると思います。

STA24では、全データを素早く処理して、グラフでチェックすることで、ニュートラルポイントのアルゴリズムが適応可能かの検証になりました。
滑走データによって、差分がノイズでたくさんでてしまうとニュートラル判断できなかったり、ずっと直進がつづくシュテム練習では
ニュートラルポイントがみつけにくい点とかアルゴリズムを改良しなければいけない場面が判ってよかったです。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です