見出し画像

Google ColaboratoryでPythonを始める-17/Altairで動的グラフの作成-4(時系列データの分析)

こんにちはロック204チャンネルです。
今回は「Google ColaboratoryでPythonを始める 17
Altairで動的グラフの作成 4(時系列データの分析)」をお送りします。

今回は、前回の続きとなりますので、まだ前回の動画をご覧になっていない方は先に前回の動画をご覧になることをお勧めします。

前回までの流れ

前のスライドで説明したところまで行った後の処理を説明して行きます。
最初にEMG1を整流して表示するプログラムについて解説します。
このスライドはコードの前半部分を示しています。
整流処理は、波形のマイナス部分をプラス部分に反転して、すべてのデータをプラス方向のデータとする処理のことです。
したがって、測定値の絶対値を求めれば整流処理となります。
最初に3行でDataFrame「EMG_data」を「seiryuu」 に代入します。
そして4行でseiryuuのEMG1列の絶対値を計算して、seiryuuのEMG1列に代入します。
5行目以降は変換されたseiryuuの値を折れ線グラフで表示して行きます。
9行でx軸にsec列をセットし、11行で0秒から秒(sec)の最大値までを表示範囲とします。

こちらがプログラムの後半部分となります。
18行から21行にかけて、マウスの位置のデータに合わせた時に表示する値をtooltipで設定しています。
表示する値は、secとEMG1の値となります。
22行の終わりにinteractiveを付加して動的表示を可能としています。

こちらが整流処理された波形を表示したグラフとなります。
グラフにマウスオーバーすると、このスライドのようにsecとEMG1の値が表示されるようになっています。

#EMG1を整流して波形表示する
import altair as alt
seiryuu=EMG_data
seiryuu["EMG1"]=seiryuu['EMG1'].abs() #絶対値を求める
(
    alt.Chart(seiryuu)
    .mark_line()
    .encode(
        x=alt.X("sec",
        type="quantitative",
        scale=alt.Scale(domain=[0,sec_max])
        ),

        y=alt.Y("EMG1",
        type="quantitative"
      ),
         #マウスの位置のデータを表示する         tooltip=[
            alt.Tooltip(field="sec",format='.3'),
            alt.Tooltip(field="EMG1",format='.3'),
        ]
    ).properties(width=600, height=300,title="整流波形 "+str(Client_ID)).interactive()
)

次に整流されたデータの移動平均を求め、統計値を表示するプログラムについて説明します。
①では、何項のデータを元に移動平均を求めるかを入力するプログラムとなります。
移動平均の項数は変数kousuuに入力されます。
入力時にenterを押すと、既定値の7がkousuuとなります。
②は移動平均を求めるプログラムとなります。
12行でseiryuuのEMG1列を変数bfに代入します。
そして13行で移動平均を求めます。この時windowに項数を設定し、min_periodsに0を設定し、.mean()とします。
min_periodsは計算に必要な最小データ数を指定するための属性です。
これによって①で設定した項数に基づき移動平均を計算し、変数move_avに結果を取得します。
16行でわDataFrame seiryuuにmoveing_wave列を追加しmove_avを代入しています。

次に、①では、グラフ上でドラッグして選択する区間をx軸とするように設定しています。
そして26行では、opacityを用いて表示区間の不透明度を設定しています。
conditionの後に、brushを書き、次に選択された区間の不透明度を1として、他の領域選択されていない部分を0.7として設定しています。

次に表示されたライン上にマウスオーバーした時の統計値を表示する方法について説明します。
35行ではmoving_av列の平均値をy軸とするよう設定しています。
38行から44行にかけての記述がマウスオーバーしたときの命令となります。
tooltipの中にリストとして表示する統計値を書いていきます。
38行では、sec列の最小値を表示します。Qと書かれているのはデータタイプがquantitative連続量のことを意味しています。
同様に39行では、列secの最大値を求めるものです。
以下、移動平均moving_waveの平均、標準偏差、最大値、最小値を表示するように設定しています。
また③に示すのは、ドラッグして選択した区間をフィルターするための記述です。
それでは実行結果を見て行きましょう。


移動平均を求め区間の統計値を表示-4

#@title 移動平均を求める
from altair.vegalite.v4.api import layer

in_str=input("何項の移動平均を求めますか?(規定値 7) =")
if(in_str==""):
  kousuu=7
else:
  kousuu=int(in_str)

print("")
print("")
bf=seiryuu["EMG1"]
move_av=bf.rolling(window=kousuu,min_periods=0).mean()
#rolling().meanで移動平均を計算、windowに項数、
#min_priodsに計算に必要な最小データ数を指定する
seiryuu['moving_wave']=move_av  #移動平均した整流波形を追加 
#移動平均した整流波形を表示
print("")
brush = alt.selection(type='interval', encodings=['x'])
#ドラッグして選択領域を設定する区間をx軸とする

bars = alt.Chart(seiryuu).mark_line().encode(
    x='sec',
    y='moving_wave',
    opacity=alt.condition(brush, alt.OpacityValue(1), alt.OpacityValue(0.7)) 
    #Opacityで不透明度を設定する。
    #brush:ドラッグして選択した区間(1)不透明度1,他の領域(0.7)
    ,tooltip=[alt.Tooltip(field="sec",format='.3'),
            alt.Tooltip(field="RectWave",format='.3'),]  #マウスオーバーで値を表示 ) .add_selection(brush).properties(width=600, height=300,
   title="EMG整流波形 "+str(Client_ID)+"("+str(kousuu)+"項移動平均)")
 #選択区間の平均値を横線で表示する line = alt.Chart(seiryuu).mark_rule(color='red').encode(
    y='mean(moving_wave):Q',#type='quantative'
    size=alt.SizeValue(3),
     #マウスオーバーで統計値を表示     tooltip=['min(sec):Q',
             'max(sec):Q',
             'mean(moving_wave):Q',
             'stdev(moving_wave):Q',
             'max(moving_wave):Q',
             'min(moving_wave):Q'],
).transform_filter(brush)
 #ドラッグして選択した区間をフィルターする 
alt.layer(bars, line) #barsとlineを重ね合わせて表示する


※コードのリンク(こちらから共有したGoogle Colaboのプログラムが使用できます。)


この記事が気に入ったらサポートをしてみませんか?