mwindow スライド窓の生成 -------------------------------- 複数行をずらしながら複製していく。 移動平均の計算など、時系列データにおいて一定幅の窓を設定し、 その窓をずらしながらその窓を単位に何らかの処理(例えば平均)をする目的に利用する。 このような窓をスライド窓(sliding window)と呼ぶ。 典型的な例を :numref:`mwindow_input` 〜 :numref:`mwindow_out2` に示す。 .. csv-table:: 入力データ :header-rows: 1 :name: mwindow_input date,val 4/6,1 4/7,2 4/8,3 4/9,4 .. csv-table:: wk=date:win t=2 :header-rows: 1 :name: mwindow_out1 win,date,val 4/7,4/6,1 4/7,4/7,2 4/8,4/7,2 4/8,4/8,3 4/9,4/8,3 4/9,4/9,4 .. csv-table:: wk=date:win t=2 -r :header-rows: 1 :name: mwindow_out2 win,date,val 4/6,4/6,1 4/6,4/7,2 4/7,4/7,2 4/7,4/8,3 4/8,4/8,3 4/8,4/9,4 :numref:`mwindow_input` に示される入力データは日別の集計値が4日分示されており、スーパーの売上推移や株価推移と考えればよい。 この入力データについて、2日間を窓サイズとして移動平均を計算することを考える。 入力データに示される日付4/6〜4/9についてサイズ2の窓を作成すると [(4/6,1),(4/7,2)], [(4/7,2),(4/8,3)], [(4/8,3),(4/9,4)]の3つの窓が作成される。 ここで`[]'は一つの窓を示し、`()'は行を示すものとする。 そしてこれらの窓のユニークキー(以下「窓キー」と呼ぶ)として、 各窓の日付の最大値( ``wk=`` で指定した項目の最終行の値)をwinという項目名で出力する( :numref:`mwindow_out1` )。 窓キーを各窓の最小値(先頭行)とするには ``r`` オプションを用いればよい( :numref:`mwindow_out2` )。 あとは、出力結果( :numref:`mwindow_out1` )に対して ``mavg`` を実行することで移動平均が計算される。 ちなみに ``mmvavg`` コマンドは、上述の一連の処理( ``mwindow`` + ``mavg`` )と同様の処理を行うが、 ``mmvavg`` の方が高速である(約3.5倍速:200MB,1000万件データで窓サイズを10で実験した結果)。 パラメータ '''''''''''''''''''''' **o=** : 型=str , 任意(default=標準出力) | 出力データを指定する。 **wk=** : 型=str , 必須 | 出力データにおいて、窓をユニークに識別する値となる入力データ上の項目を指定する。 | ここで指定した項目で並べ替えられたのちスライド窓を生成していくが、 | 降順で並べ替えるときは\%r、数値として並べ替えるときは\%nと追加する。 | 数値の降順で並べ替えるときは\%nrと追加すればよい。 | またコロンに続いて窓キーの項目名を指定しなければならない。複数項目を指定することもできる。 **t=** : 型=str , 必須 | 窓のサイズ(行数)を指定する。 **k=** : 型=str , 任意(default=キーブレイク処理しない) | ここで指定された項目の値を単位に窓の生成を行う。 **r=** : 型=bool , 任意(default=False) | 窓における基準行を先頭行とする。指定がなければ最終行となる。 **n=** : 型=bool , 任意(default=False) | 窓のサイズが ``t=`` で指定した行数に満たなくても出力する。 **i=** : 型=str , 任意(default=標準入力) | 入力データ **nfn=** : 型=bool , 任意(default=False) | 入力データの1行目を項目名行とみなさない。 共通パラメータ '''''''''''''''''''' :ref:`assert_diffSize=` , :ref:`assert_nullkey=` , :ref:`nfn=` , :ref:`nfno=` , :ref:`x=` , :ref:`q=` , :ref:`tmppath=` , :ref:`precision=` 利用例 '''''''''''' **importと入力データ(CSV)の準備** .. code-block:: python :linenos: import nysol.mcmd as nm with open('dat1.csv','w') as f: f.write( '''date,val 20130406,1 20130407,2 20130408,3 20130409,4 ''') with open('dat2.csv','w') as f: f.write( '''store,date,val a,20130406,1 a,20130407,2 a,20130408,3 a,20130409,4 b,20130406,11 b,20130407,12 b,20130408,13 b,20130409,14 ''') **基本例** .. code-block:: python :linenos: nm.mwindow(wk="date:win", t="2", i="dat1.csv", o="rsl1.csv").run() ### rsl1.csv の内容 # win%0,date,val # 20130407,20130406,1 # 20130407,20130407,2 # 20130408,20130407,2 # 20130408,20130408,3 # 20130409,20130408,3 # 20130409,20130409,4 **基準行を先頭にした例** .. code-block:: python :linenos: nm.mwindow(wk="date:win", t="3", r=True, i="dat1.csv", o="rsl2.csv").run() ### rsl2.csv の内容 # win%0,date,val # 20130406,20130406,1 # 20130406,20130407,2 # 20130406,20130408,3 # 20130407,20130407,2 # 20130407,20130408,3 # 20130407,20130409,4 **指定行数に満たない窓も出力する例** .. code-block:: python :linenos: nm.mwindow(wk="date:win", t="3", r=True, n=True, i="dat1.csv", o="rsl3.csv").run() ### rsl3.csv の内容 # win%0,date,val # 20130406,20130406,1 # 20130406,20130407,2 # 20130406,20130408,3 # 20130407,20130407,2 # 20130407,20130408,3 # 20130407,20130409,4 # 20130408,20130408,3 # 20130408,20130409,4 # 20130409,20130409,4 **キー項目を指定した例** .. code-block:: python :linenos: nm.mwindow(k="store", wk="date:win", t="2", i="dat2.csv", o="rsl4.csv").run() ### rsl4.csv の内容 # win%1,store%0,date,val # 20130407,a,20130406,1 # 20130407,a,20130407,2 # 20130408,a,20130407,2 # 20130408,a,20130408,3 # 20130409,a,20130408,3 # 20130409,a,20130409,4 # 20130407,b,20130406,11 # 20130407,b,20130407,12 # 20130408,b,20130407,12 # 20130408,b,20130408,13 # 20130409,b,20130408,13 # 20130409,b,20130409,14 **前日までの移動平均を求める** 冒頭に示した移動平均の例では、窓における最終日を基準として平均を計算している。 時に、基準日を前日として移動平均を計算したいケースがある。 そういった場合は ``mslide`` で1日日付をずらしてから本コマンドを使えばよい。 その例を以下に示す。 .. code-block:: python :linenos: nm.mslide(f="date:date2", s="date", i="dat1.csv", o="rsl5.csv").run() nm.mwindow(wk="date2:win", t="2", i="rsl5.csv", o="rsl6.csv").run() ### rsl5.csv の内容 # date%0,val,date2 # 20130406,1,20130407 # 20130407,2,20130408 # 20130408,3,20130409 関連メソッド '''''''''''''''''''' * :doc:`mmvavg` : 移動窓の平均(移動平均)に特化した計算コマンド。 * :doc:`mmvstats` : 移動窓の各種統計量を計算する。