過去の桐井戸端BBS (桐ver.8)
16203 直前5レコードの合計という風に決まった行数の合計を計算させたい masa 2002/05/29-18:26
今晩は。また疑問が出てしまいましたのでよろしくお願いします。
株価でよく5週平均とか13週平均とかのデータを使用しますが、
例えば直前5レコードの合計とかを計算させる計算式って出来るのでしょうか?

 「日付」 「終値」  「直前5日合計」
1999/01/25 208
1999/01/26 382
1999/01/27 450
1999/01/28 342
1999/01/29 499 1,881
1999/01/30 
1999/01/31 
1999/02/01 465 2,138
1999/02/02 349 2,105
1999/02/03 161 1,816
1999/02/04  86 1,560
1999/02/05 898 1,959
以下続く

↑求めたい計算式

やはり転置集計して横にして合計を出すしかないでしょうか?
よろしくお願い致します。

16205 Re:決まった行数の合計について T.Samura 2002/05/29-20:32
記事番号16203へのコメント
 masa さんこんばんは。
[直前5日合計]の計算式を以下のようにしたらできましたのでお試し下さい。
「メニュー」「ファイル」「ファイル属性」の未定義項目値処理は未定義にして下さい。

#計算(
#cond(
#直前値([直前5日合計],-1)=(-1),
#計算(
#代入(&年月日,#undef),#代入(&時刻,#undef),
#代入(&STR,#undef),#代入(&比較式,#undef),
#代入(&置換式,#undef)
)
),
#cond(
[終値]<>#undef,
#計算(
#代入(&年月日,&時刻),#代入(&時刻,&STR),#代入(&STR,&比較式),
#代入(&比較式,&置換式),#代入(&置換式,#STR([終値]))
)
),
#cond(
[終値]<>#undef .and &年月日<>#undef .and &時刻<>#undef
.and &STR<>#undef .and &比較式<>#undef .and &置換式<>#undef,
#数値(&年月日)+#数値(&時刻)+#数値(&STR)+#数値(&比較式)
+#数値(&置換式)
)
)


16206 Re:決まった行数の合計について うにん 2002/05/29-21:22
記事番号16204へのコメント
&STRを使う方法。最初に&STR=",,,,"にしてから項目置換します。
#条件選択([終値]<>#未定義,#計算(#代入(&STR,#部分列(&STR,#文字位置
(&STR,",")+1)+","+#STR([終値])),#数値(#対応文字列(&STR,1))+#数値(
#対応文字列(&STR,2))+#数値(#対応文字列(&STR,3))+#数値(#対応文字列
(&STR,4))+#数値(#対応文字列(&STR,5))))

配列を使う方法。&保存という数値変数を5要素で定義しておきます。
#条件選択([終値]<>#未定義,#計算(#代入(&保存[1],&保存[2]),#代入(&保存
[2],&保存[3]),#代入(&保存[3],&保存[4]),#代入(&保存[4],&保存[5]),#代入
(&保存[5],[終値]),&保存[1]+&保存[2]+&保存[3]+&保存[4]+&保存[5]))

[終値]<>#未定義の判定をするので、未定義項目値処理は「未定義」にしないとだめです。

16208 Re:決まった行数の合計について masa 2002/05/30-00:37
記事番号16205へのコメント
T.Samuraさん 今晩は。
どうも有難う御座います。
さすがに難しい式で出来ましたが自分でも理解したいので、お手数ですがもう少し教えて下さい。

>#計算(
> #cond(
> #直前値([直前5日合計],-1)=(-1),          ・・・・・@
> #計算(
> #代入(&年月日,#undef),#代入(&時刻,#undef),    ・・・・A
> #代入(&STR,#undef),#代入(&比較式,#undef),
> #代入(&置換式,#undef)
> )
> ),
> #cond(
> [終値]<>#undef,
> #計算(
> #代入(&年月日,&時刻),#代入(&時刻,&STR),#代入(&STR,&比較式),
> #代入(&比較式,&置換式),#代入(&置換式,#STR([終値]))
> )
> ),
> #cond(
> [終値]<>#undef .and &年月日<>#undef .and &時刻<>#undef
> .and &STR<>#undef .and &比較式<>#undef .and &置換式<>#undef,
> #数値(&年月日)+#数値(&時刻)+#数値(&STR)+#数値(&比較式)
> +#数値(&置換式)
> )
>)
>

@の行だけ入れてみると先頭行だけ1で後は0になりましたが、=(-1)これは
どういう意味があるのでしょうか?
(先頭の4行だけ合計させない為だとは思いますが
この直前値で先頭4行が0になるのが不思議です)
=(-1)こういう使い方は始めて見ました。

5日分の計算なのでAの行の&時刻まで関係ないのでは?と思い、試しに&時刻に関する式を
全て削除すると直前の4行毎の合計になってしまいました。
&時刻を消す事によって1行計算されなくなってしまうのですね?不思議です。

--------&時刻に関するものを削除してみました↓-----------
#計算(
#cond(
#直前値([直前5日合計],-1)=(-1),
#計算(
#代入(&年月日,#undef),
#代入(&STR,#undef),#代入(&比較式,#undef),
#代入(&置換式,#undef)
)
),
#cond(
[終値]<>#undef,
#計算(
#代入(&年月日,&STR),#代入(&STR,&比較式),
#代入(&比較式,&置換式),#代入(&置換式,#STR([終値]))
)
),
#cond(
[終値]<>#undef .and &年月日<>#undef .and
&STR<>#undef .and &比較式<>#undef .and &置換式<>#undef,
#数値(&年月日)+#数値(&STR)+#数値(&比較式)
+#数値(&置換式)
)
)

よろしくお願いします。

16209 Re:決まった行数の合計について masa 2002/05/30-00:50
記事番号16206へのコメント
うにんさん 今晩は。
どうも有難うございます。

>&STRを使う方法。最初に&STR=",,,,"にしてから項目置換します。

&STR=",,,,"にする方法が解りませんでした。(文字で,,,,を入力して右クリック
でコピーしたのですが&STR=",,,,"になってませんでした)

>#条件選択([終値]<>#未定義,#計算(#代入(&STR,#部分列(&STR,#文字位置
>(&STR,",")+1)+","+#STR([終値])),#数値(#対応文字列(&STR,1))+#数値(#対
>応文字列(&STR,2))+#数値(#対応文字列(&STR,3))+#数値(#対応文字列
>(&STR,4))+#数値(#対応文字列(&STR,5))))


>
>配列を使う方法。&保存という数値変数を5要素で定義しておきます。

&保存を共通で新規で作ろうとしても「変数名の形式にあやまりがあります」で
できませんでした。

>#条件選択([終値]<>#未定義,#計算(#代入(&保存[1],&保存[2]),#代入(&保存
>[2],&保存[3]),#代入(&保存[3],&保存[4]),#代入(&保存[4],&保存[5]),#代入
>(&保存[5],[終値]),&保存[1]+&保存[2]+&保存[3]+&保存[4]+&保存[5]))
>
>[終値]<>#未定義の判定をするので、未定義項目値処理は「未定義」にしない
>とだめです。
>
すみませんがもう少し教えて下さい。
よろしくお願いします。

16210 Re:決まった行数の合計について masa 2002/05/30-01:03
記事番号16208へのコメント
T.Samuraさん 今晩は。
そうそう他にも不思議なのですが、これは例えばで5日分の合計なのですが
20日分の合計だったらどうなるのでしょうか?5日分(5レコード分)が
どこで計算されているのか不思議です。
よろしくお願いします。

16211 #直前値を使って項目計算式で処理するのが簡単です 佐田 守弘 2002/05/30-01:54
記事番号16203へのコメント
masaさん
分かりやすくて簡単な方法を紹介します。
●考え方
前日の終値は、#直前値([終値],0)で計算できる事はご存知だと思います。
この直前値を求めれば、前日の「前日終値」ですから、2日前の終値になります。

同様にして何日前の終値も計算項目に作れます。後はこれを合計するなり、
平均するなりすれば良いでしょう。

●方法
まず表に、[前1][前2][前3][前4][直前5日合計]の項目を作ります。
計算式は次の通りです。
[前1] #直前値([終値],0)
[前2] #直前値([前1],0)
(以下同様)
[直前5日合計]:[終値]+[前1]+[前2]+[前3]+[前4]
  あるいは、#横合計([終値],[前4])

●注意点(1)直前値の第2パラメータ
以上の説明で、#直前値関数の第2パラメータを0としましたが、
これはいささか考える必要があります。何が良いかは私に判断できませんので、
以下を参考にmasaさんが決めて下さい。

@#未定義を設定する
本来はこれが正しいでしょう。先頭行の直前は存在しないので、
無効の意味で「バーを引く」のと同じ考え方です。
ただし、合計で足算を使うと、結果が未定義になってしまいます。
なお、#横合計を使えば、未定義値は除外して計算してくれます。

A0を設定する
足算を使って合計を求める時に、「前日値がないなら加えない」とするなら
0を設定して下さい。0を加えるのは何も加えないのと同じになります。

Bその行の終値ないし、1日前の終値を設定する
この方法もあるでしょうね。先頭行でその前の日のデータがない時には、
その日のデータをもって前日の値とみなせば、合計を取っても、
他の行と大きくかけ離れた値にはならないと思います。

●途中に休日がある時
休日の後は、先頭4行と同じ事が起きます。
もし休日は除外するなら、未定義値の行を除外して再計算して下さい。

佐田守弘(KS-00119)
16214 Re:決まった行数の合計について T.Samura 2002/05/30-08:26
記事番号16210へのコメント
 masa さん、おはようございます。
 各ポイントを説明します。

◇&年月日 &時刻 &STR &比較式 &置換式
 宣言しないで使える組込みの文字列型変数を利用してます。
 宣言(共通で新規作成)するなら &4日前 &3日前 &2日前 &1日前 &当日
 などという名前に置き換えると理解しやすいと思います。
 &年月日 &時刻 の初期値("2002/05/30" や "08:11:10")は使いません。
◇#直前値([直前5日合計],-1)=(-1)
 これは先頭レコードでのみ#代入(&年月日,#undef)〜をさせたい為です。
 つまり変数を未定義値で初期化させています。
 &年月日 &時刻 の初期値を消すのと再計算時に以前の最後の5レコード
 の記憶を消す為です。
◇全体の構造は #計算(#cond(),#cond(),#cond())
 最初の#cond()で変数初期化。
 次の#cond()で[終値]が有れば&当日に[終値]を記憶。
 &当日は&1日前にコピー。続けて&4日前までコピー。
 結果的に変数には5レコード分の値が格納される。
 最後の#cond()で[終値]が有り&当日〜&4日前まで値が有れば
 &当日〜&4日前を加算して値を返します。
◇5日分以外の集計をするならその分だけ変数を用意するか
 うにんさんの様に&STRに複数値をまとめる必要があります。
 ただ20日分だと項目計算式の長さが引っかからないか心配です。

16215 Re:決まった行数の合計について うにん 2002/05/30-08:36
記事番号16209へのコメント
>&STR=",,,,"にする方法が解りませんでした。(文字で,,,,を入力して右クリック
>でコピーしたのですが&STR=",,,,"になってませんでした)

ちょっと書き方が不親切でしたね。
文字列変数を使う方法、という意味で、組み込みの&STRを使ってみました。
",,,,"にする、というのは文字列変数の値を半角コンマ4つにする、という意味でした。
変数管理でSTRを選んで「変更」のダイアログの「変数の値」の中に半角コンマを4つ入力すればいいのですが。
&STR=",,,,"と一括コマンド風に書いてしまいましたが、変数管理では"は見えません。内容のところが半角コンマ4つになってればokです。

>>配列を使う方法。&保存という数値変数を5要素で定義しておきます。
>
>&保存を共通で新規で作ろうとしても「変数名の形式にあやまりがあります」で
>できませんでした。

変数を作るときは変数名には「&」は含めず「保存」です。&は、
変数であることを示すために計算式の中などでつけます。
項目名に[]がついてるのと似たようなものです。

16216 Re:決まった行数の合計について うにん 2002/05/30-08:57
記事番号16214へのコメント
おはようございま〜す

>◇#直前値([直前5日合計],-1)=(-1)
> これは先頭レコードでのみ#代入(&年月日,#undef)〜をさせたい為です。
> つまり変数を未定義値で初期化させています。
> &年月日 &時刻 の初期値を消すのと再計算時に以前の最後の5レコード
> の記憶を消す為です。

うまい方法が思いつかなかったのと、配列変数の場合はどっちみち宣言が必要なので、
私の計算式では省略してましたが、先頭レコードの判定は「#行番号=1」でできるようです。

>◇全体の構造は #計算(#cond(),#cond(),#cond())
> 最初の#cond()で変数初期化。
> 次の#cond()で[終値]が有れば&当日に[終値]を記憶。
> &当日は&1日前にコピー。続けて&4日前までコピー。
> 結果的に変数には5レコード分の値が格納される。
> 最後の#cond()で[終値]が有り&当日〜&4日前まで値が有れば
> &当日〜&4日前を加算して値を返します。

&当日〜&4日前は、値が未定義なのがあれば合計も自動的に未定義になります。

>◇5日分以外の集計をするならその分だけ変数を用意するか
> うにんさんの様に&STRに複数値をまとめる必要があります。
> ただ20日分だと項目計算式の長さが引っかからないか心配です。

そうなんですよね。
#合計(配列名,開始インデックス,終了インデックス)みたいな関数があればいいんですが。
その点、佐田さんの項目を使う方法は心配がないですね。


16217 Re:決まった行数の合計について natsu 2002/05/30-09:39
記事番号16203へのコメント
「5段下りたら、4段戻る」一括処理だとこんな感じでしょうか

絞り込み [終値]≠#U
繰り返し
&実行リターン=0
繰り返し &昭和年=1,5
&実行リターン=[終値]+&実行リターン
条件 (&昭和年=5) 行訂正 [直前5日合計]=&実行リターン
ジャンプ 行番号=次行
分岐 (#eof=1),処理終了
繰り返し終了
ジャンプ 行番号=-4
繰り返し終了
名札 処理終了
絞り込み解除

16219 Re:決まった行数の合計について masa 2002/05/30-17:57
記事番号16214へのコメント
T.Samuraさん こんにちは。

>◇&年月日 &時刻 &STR &比較式 &置換式
> 宣言しないで使える組込みの文字列型変数を利用してます。
> 宣言(共通で新規作成)するなら &4日前 &3日前 &2日前 &1日前 &当日
> などという名前に置き換えると理解しやすいと思います。
> &年月日 &時刻 の初期値("2002/05/30" や "08:11:10")は使いません。

なるほど。&時刻=時間ではなく、&3日前等のデータを入れていると言う事ですね。
(だから削除すると4行分の合計になってしまった訳ですか・・・)

>◇#直前値([直前5日合計],-1)=(-1)
> これは先頭レコードでのみ#代入(&年月日,#undef)〜をさせたい為です。
> つまり変数を未定義値で初期化させています。

ここは未だ解らないのですが、#代入(&年月日,#undef)だけで初期化できるので
直前値はどうしているのだろうと思ってしまうのです。
(試しに削除してみようとしたら終りのどれかのカッコがエラーで確認できませんでした)

> &年月日 &時刻 の初期値を消すのと再計算時に以前の最後の5レコード
> の記憶を消す為です。
>◇全体の構造は #計算(#cond(),#cond(),#cond())
> 最初の#cond()で変数初期化。
> 次の#cond()で[終値]が有れば&当日に[終値]を記憶。
> &当日は&1日前にコピー。続けて&4日前までコピー。
> 結果的に変数には5レコード分の値が格納される。
> 最後の#cond()で[終値]が有り&当日〜&4日前まで値が有れば
> &当日〜&4日前を加算して値を返します。
>◇5日分以外の集計をするならその分だけ変数を用意するか
> うにんさんの様に&STRに複数値をまとめる必要があります。
> ただ20日分だと項目計算式の長さが引っかからないか心配です。

20個分の変数とそれぞれの式が必要になる訳ですね。
ほぼ理解できました。ありがとう御座います。


16220 Re:決まった行数の合計について masa 2002/05/30-18:10
記事番号16215へのコメント
うにんさん こんにちは。
どうもありがとう御座います。

>変数管理でSTRを選んで「変更」のダイアログの「変数の値」の中に半角コンマを4つ入力すればいいのですが。
>&STR=",,,,"と一括コマンド風に書いてしまいましたが、変数管理では"は見えません。内容のところが半角コン
>マ4つになってればokです。

出来ました。ありがとう御座います。


>>>配列を使う方法。&保存という数値変数を5要素で定義しておきます。
>>
>>&保存を共通で新規で作ろうとしても「変数名の形式にあやまりがあります」で
>>できませんでした。
>
>変数を作るときは変数名には「&」は含めず「保存」です。&は、変数であることを示すために計算式の中などで
>つけます。項目名に[]がついてるのと似たようなものです。
>
おかげさまで保存の変数は出来たのですが、計算さしょうとすると[←で止まってしまいました。


16221 Re:#直前値を使って項目計算式で処理するのが簡単です masa 2002/05/30-18:44
記事番号16211へのコメント
佐田 守弘さん 今晩は。

>●方法
>まず表に、[前1][前2][前3][前4][直前5日合計]の項目を作ります。
>計算式は次の通りです。
>[前1] #直前値([終値],0)
>[前2] #直前値([前1],0)
>(以下同様)
>[直前5日合計]:[終値]+[前1]+[前2]+[前3]+[前4]
>  あるいは、#横合計([終値],[前4])

必ずしも自分自身の項目のではなく別の項目の直前置が使える訳ですね。
これですと20日分でも60日分でも計算式で出ますね。
(ただ直前60日合計のデータ量だと実際にまだやってないのですが
日々データが重くなりそうなのが気がかりですが。)出来れば数列で出れば
最高ですが贅沢ですね。・・・・
どうもありがとう御座いました。


16222 Re:決まった行数の合計について masa 2002/05/30-18:54
記事番号16217へのコメント
natsuさん 今晩は

>絞り込み [終値]≠#U
>繰り返し
>&実行リターン=0
>繰り返し &昭和年=1,5
>&実行リターン=[終値]+&実行リターン
>条件 (&昭和年=5) 行訂正 [直前5日合計]=&実行リターン
>ジャンプ 行番号=次行
>分岐 (#eof=1),処理終了
>繰り返し終了
>ジャンプ 行番号=-4
>繰り返し終了
>名札 処理終了
>絞り込み解除
>
あっそうか。
こういう方法もあるんですね。
項目計算式で求めたかったので考えてませんでした。
日にちも5や20等変えるだけなので簡単ですね。
実際は銘柄数が1000〜9700程で、日々のデータを追加する予定なので、
計算式の方が速いか一括処理が早いかですね。
どうもありがとう御座います。

16223 Re:決まった行数の合計について T.Samura 2002/05/30-19:25
記事番号16219へのコメント
 masa さん、こんばんは。
 変数の初期化についてですが、項目計算式の動作、#cond() #計算()
#直前値() 関数の動作を理解して下さい。
 項目計算式はステップでみると先頭レコードから終端レコードまで
該当項目に計算式の結果を書き込んでいきます。だから初期化は先頭レコードでのみ
実施しないと2レコード以降で以前のレコードで記憶した変数値を破壊してしまいます。
 #cond(条件式, 計算式)なので、先頭レコードでは条件式の#直前値
([直前5日合計],-1)=(-1)が成立するので計算式が実行され
#代入(&年月日,#undef)〜で変数を未定義値で初期化します。
2レコード以降は条件式が成立しないので計算式が実行されず初期化はされません。


16227 Re:決まった行数の合計について うにん 2002/05/31-08:42
記事番号16220へのコメント
masaさん

>おかげさまで保存の変数は出来たのですが、計算さしょうとすると[←で止まってしまいました。

「配列として作成する」のチェックを忘れてませんでしょうか?
そして、その下の「配列要素の数」を5にします。

独り言:今書いてて思いつきましたが、配列要素の数を合計したい日数x2-1にしておいて、リングバッファのように使えば
毎回データをずらす必要がなくなります。

16229 Re:決まった行数の合計について masa 2002/05/31-10:00
記事番号16223へのコメント
T.Samuraさん おはよう御座います。
度々すみません。

> #cond(条件式, 計算式)なので、先頭レコードでは条件式の#直前値
>([直前5日合計],-1)=(-1)が成立するので計算式が実行され
先頭行だけが問題なわけですね?その仕組みは解りましたが、
直前値の判定の仕方で疑問が出てしまいました。

1番先頭行が(-1)=(-1)ですが、実際に
#直前値([直前5日合計],-1)=(-1)だけをいれてみると
表示画面は 1 になります。(-1)=(-1)が 1 とういう事も不思議でした。
-1は-1なので答えは-1ではないのですね。
2行目に移ると先頭行が表示画面上 1 なので 直前値 1=-1(数学上で何か変な気が・・・)で
表示画面上 0 になっています。
3行目以降は、直前値が 0 なのに 0=-1 でも表示画面上 0 になってます。
どうしてなんでしょうか?
よろしくお願い致します。


16231 Re:決まった行数の合計について うにん 2002/05/31-10:37
記事番号16216へのコメント
うにんさんは No.16216「Re:決まった行数の合計について」で書きました。

>そうなんですよね。#合計(配列名,開始インデックス,終了インデックス)みたいな関数があればいいんですが

#配列合計(配列名)という関数はありました(^^;
ただし、未定義値が含まれていても0として計算します。

合計したい行数が増えても計算式が長くならないものを考えてみました。
数値変数&次を定義
配列変数&仮2を通貨型で要素数「合計したい行数+1」で定義
項目計算式に次の式を設定(式の中の「5」は合計したい行数、「6」はそれ+1、つまり&仮2の要素数)
#条件選択(#行番号=1,#計算(#配列代入("仮2",0),#代入(&仮2[1],[終値]),#代入(&次,2),[終値]),1,#計算(#代入
(&仮2[&次],[終値]),#代入(&次,#MOD(&次,6)+1),#直前値([],0)+[終値]-&仮2[#MOD(&次+5,6)+1]))で、
[終値]未定義の行は絞込みで除外して項目再計算させると、できます。
(最初の数行は少ない行数の合計になります)

16232 Re:決まった行数の合計について masa 2002/05/31-10:49
記事番号16227へのコメント
うにんさん おはよう御座います。
度々ありがとう御座います。

>「配列として作成する」のチェックを忘れてませんでしょうか?
>そして、その下の「配列要素の数」を5にします。
これはどこでチェック出来るのでしょうか?「項目属性」も「項目の表示条件」も見たのですが解りませんでした。
よろしくお願いします。


16234 Re:決まった行数の合計について masa 2002/05/31-12:04
記事番号16232へのコメント
うにんさん こんにちは。

いろいろ探してようやく見付けました。
(変数事態あまり使わなかったので初めて見ました。)
ありがとう御座いました。


16237 Re:決まった行数の合計について T.Samura 2002/05/31-14:31
記事番号16229へのコメント
>#直前値([直前5日合計],-1)=(-1)だけをいれてみると
>表示画面は 1 になります。(-1)=(-1)が 1 とういう事も不思議でした。
>-1は-1なので答えは-1ではないのですね。
>2行目に移ると先頭行が表示画面上 1 なので 直前値 1=-1(数学上で
>何か変な気が・・・)で表示画面上 0 になっています。
>3行目以降は、直前値が 0 なのに 0=-1 でも表示画面上 0 に
>なってます。
>どうしてなんでしょうか?

 a=bと項目計算式に入れると比較式(条件式)になるようなので
結果は論理値で真(桐では1のようです)か偽(0)になります。
 よって(-1)=(-1)は真(成立する)なので 1、0=(-1)は
偽(成立しない)なので 0 になります。
16238 Re:決まった行数の合計について masa 2002/05/31-15:12
記事番号16237へのコメント
T.Samuraさん こんにちは。
度々ありがとう御座います。

> a=bと項目計算式に入れると比較式(条件式)になるようなので
>結果は論理値で真(桐では1のようです)か偽(0)になります。
> よって(-1)=(-1)は真(成立する)なので 1、0=(-1)は
>偽(成立しない)なので 0 になります。
1 とか 0 は計算の答えではなく真とか偽とかの事だったのですね
#直前値でもそういう判定をしているなんて初めて知りました。
ありがとう御座います。

16239 Re:ありがとう御座います。出来ました。 masa 2002/05/31-17:59
記事番号16203へのコメント
うにんさん T.Samuraさん 佐田さん natsuさん
どの方法でも出来ました。データ量と時間を見比べながら利用させて頂きます。
どうもありがとう御座いました。

戻る