背景
PowerBIの練習で、以下の記事みたいな分析をしようとしています。
[Python] くりっく株365ヒストリカルデータを解析する(リピート注文) #Python - Qiita
以下のアプローチでやろうとしていています。
- 行に前日終値と当日終値を持たせる
- 前日終値<買い指値<=当日終値 の条件列を持たせる
- 上記条件がマッチした間の、高値・安値・間隔を計算する
「上記条件がマッチした間」を分類したいので、条件列を0/1にして、その累積和を取ることにしました。
Python(pandas)だとこんな感じ。
df[f'Closs_Over_{th}'] = ((df['prev'] < th) & (th <= df['bid'])).cumsum()
コード
シンタックスハイライトは、PowerQuery(mlang)がなかったため、そこそこ見栄えがよさそうなPythonにしています。
パフォーマンスはあまり良くなさそうです。約10年間の日足で数秒かかりました。
= (l) => let
BufferedRows = List.Buffer(l),
GroupedTh = List.Generate(
() => [i = 0, 累積 = 0],
each [i] <= List.Count(BufferedRows),
each
[
i = [i] + 1,
累積 = [累積] + BufferedRows{[i]}
],
each [累積]
)
in
GroupedTh
引数はテーブル列などを渡します。
let
ソース = Nikkei,
追加されたカスタム = Table.AddColumn(ソース, "Th", each if(([前日清算価格] < Th) and (Th<= [当日清算価格])) then 1 else 0),
並べ替えられた行 = Table.Sort(追加されたカスタム,{{"取引日", Order.Ascending}}),
累積和リスト = 累積和リスト(並べ替えられた行[Th]),
追加されたカスタム1 = Table.AddColumn(並べ替えられた行, "ThAcc", each 累積和リスト{[Index]}),
グループ化された行 = Table.Group(追加されたカスタム1, {"ThAcc"}, {{"High", each List.Max([高値]), type nullable number}, {"Low", each List.Min([安値]), type nullable number}, {"Begin", each List.Min([取引日]), type nullable date}, {"End", each List.Max([取引日]), type nullable date}}),
追加されたカスタム2 = Table.AddColumn(グループ化された行, "期間", each [End]-[Begin])
in
追加されたカスタム2
テーブルはIndex列を持っています。Table.AddColumn(..., each 累積和リスト{[Index]})
で、対応する行の累積和リストを追加してます。
使いまわしたいのでリスト生成のみで関数化しましたが、特に使いまわさない場合は 参考記事のように、List.Generate
内で直接得たいテーブル形式にしてしまった方がよいと思います。
参考
Power Query の List.Generate 関数ってなんだよー #Excel - Qiita
List.Generate - PowerQuery M | Microsoft Learn