【STA24】スキーターンアナライザSTA24_ver0.1.py備忘録<pandas Tips備忘録>

pythonでデータ処理プログラム1か月かけてようやくver0.1が完成しました。主にpandas を使ったので、pandasのTips備忘録して
STA24データ処理システム全体の備忘録も残しておきます。
pythonコードはGISTにおいてあります。
https://gist.github.com/dj1711572002/b6d6e114a4e19128115f3b8466a0148e

●STA24データ処理システムの特徴
 RTKとBNO085の全データを1個でも逃さずモニターできるようにしました。RTKとIMUのデータの同期と互いの補間もいれてあります。
 スキーターン運動の時間軸は10-100msec内で大きく動くので、100msec毎の物理量(速度ベクトル、角付け角、スキー板姿勢、落差、ターン軌跡統計)
時間毎に刻々と変化する物量とターンのTrajectory線図を同時に確認することで、どのようにスキーを操作した結果がターンになったのか理解を手伝います。
私の場合は、初心者なので、板に乗れてない滑りのデータとなってます。パラレルになっていないターンがほとんどです。
 

●pandas TIPS 備忘録

①行編集した後にindexをresetしておくこと(indexが歯抜けになっていた、後処理でindex番号無いとエラーになる)

 df_Base = df_Base.reset_index()  # index番号リセット

②列数があってないとpandas始まらない
元のデータにnull列がはいっていているがexcelでは見えないので、そのままpandasで読み込んでヘッダーをつけるとエラーになる
下記例は、7列のつもりがnull列があったので、null列を除去してからヘッダー名list_BNO0を追加している

if  len(df_BNO.columns)>8:
                    df_BNO=df_BNO.drop(range(7,len(df_BNO.columns)),axis=1 )        
df_BNO.columns=list_BNO0

③ 最終行、開始行の-1は、iloc指定
最終行を指定する-1は、iloc

df_BNO120.iloc[-1,0]

開始行と最終行を1行プリントするのはhead91) tail(1) デフォルトは5行

 print(“df_BTBNO2:”,df_BTBNO2.head(1),”\n”,df_BTBNO2.tail(1)DFDF

④DF同士の横合体では行数を合わせる場合df処理でなくlistに戻してlistで行数をあわせたデータを作ってからdf=pd.DataFrame(list)にすること
行数が少ないデータを途中行から埋め込む場合、開始行から埋め込む行までゼロデータで埋める

  list_bno = []
   #listを作成してからDFに変換 
   list_bno = [[0] * 7] * (basestart)  # 上のデータ0:basestartまでゼロ埋め
   blen = len(df_BNO120)
   for i in range(0, blen – 1):  #df_BNO120をlistに追加
                            r = df_BNO120.iloc[i, :]
                            list_bno.append(r)
   df_BNOL = pd.DataFrame(list_bno, columns=list_BNO0)

  ⑤列内のデータ検索して抽出
forループを使うより早くて1行で済む

 df_Base = df[df.iloc[:, 0] == ‘B’]  
# id列[:,0]が’B’ならばdf_Baseとして抽出

⑥列の一括処理 移動平均 rolling

 # —headMot移動平均3個MA3
    df[“headMotMA3”] = df[“headMot360”].rolling(3).mean()

⑦列の一括処理  座標間の距離計算 df.apply(lambda:   )
変数が複数ある場合はrow[列名]で参照する

  #Vaをax ayから計算代入df[‘D’] = df.apply(lambda row: row[‘A’] + row[‘B’]
        df_BNO[‘Va’] = df_BNO.apply(lambda row:math.sqrt(row[‘ax’]**2+row[‘ay’]**2), axis=1)

⑧列の一括処理 行間で直線回帰して相関係数計算
m行のデータ間で直線回帰して相関係数を求める
XY座標で直線回帰して、相関係数がたかければ直線性が高い。

for i in range(m,len(df)-m):
        x=[]
        y=[]
        for j in range(0,m-1):
            x.append(df.loc[j+i,”relPosE_B”])
            y.append(df.loc[j+i,”relPosN_B”])
        # データを用意
        # リストをps.Seriesに変換 numys seriesで処理
        X=pd.Series(x)
        Y=pd.Series(y)
        # pandasを使用してPearson’s rを計算
        res=X.corr(Y)   # numpy.float64 に格納される
        df.loc[i+n,”linecorr”]=res#i+n番目に代入5個なら i,i+1,[i+2],i+3,i+4

 

以後、思い出したtips追記していきます。

●STA24データシステムの備忘録
2種類のマイコンシステムのログでログ方式とフォーマットが全然違うので、通常のログシステムの何倍も複雑になってます。

 

●以後
STA24の目標として、MBをやめて、IMUで代替えするテーマは、スキーの要求精度が厳しい点が見えてきたので、代替えでなく
MBとIMUを併用して、より精度を上げる方向へ変更します。そのため、現在のBootsOnシステムは、使わないで、
両足MovingBaseシステムにします。5月連休までに、左足のMovingBase作成して横手渋峠スキー場で最終計測をする目標でやります。

 

コメントを残す

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