![見出し画像](https://assets.st-note.com/production/uploads/images/128888133/rectangle_large_type_2_141c1a3626b6f9439def908c7fa85b1d.png?width=1200)
移動平均:Power BI Desktopのクイックメジャー
気象庁のサイトから取得した、札幌市の日毎平均気温を利用しました。
同サイトからCSVをダウンロードし、「Power BI Desktop」にインポートします。
![](https://assets.st-note.com/img/1702031721-Hg9TQamv7s.png?width=1200)
「フィールド」→「新しいクイックメジャー」を選びます。
![](https://assets.st-note.com/img/1702031722-3RnMls7FGv.png)
「計算」から「」を選び、以下のように設定しました(7日間移動平均の例)。
![](https://assets.st-note.com/img/1702031723-loDkq9GTLI.png?width=1200)
移動平均のグラフを追加します。
![](https://assets.st-note.com/img/1702031725-rMSf8SkrCs.png?width=1200)
移動平均のDAX(Data Analysis Expressions)
「新しいクイックメジャー」を実行すると、DAXが生成されます。
上記の移動平均の場合、以下のようなコードを作成します。
平均気温(℃) 移動平均 2 =
IF(
ISFILTERED('sapporo_temp_data'[年月日]),
ERROR("タイム インテリジェンスのクイック メジャーは、Power BI が指定する日付階層またはプライマリの日付列でのみグループ化またはフィルターできます。"),
VAR __LAST_DATE = LASTDATE('sapporo_temp_data'[年月日].[Date])
RETURN
AVERAGEX(
DATESBETWEEN(
'sapporo_temp_data'[年月日].[Date],
DATEADD(__LAST_DATE, -6, DAY),
__LAST_DATE
),
CALCULATE(SUM('sapporo_temp_data'[平均気温(℃)]))
)
)
「DATEADD(__LAST_DATE, -6, DAY)」が、一番新しい日付からその前の「6日前」という指定です(最新日付を含ます6日前)。
DATEADD(__LAST_DATE, -6, DAY),
__LAST_DATE
で、6日前から一番新しい日付までの7日間の範囲を意味します。
「-6」の部分を変更することで移動平均の期間を変更できます。
改移動平均のDAX別バージョン
「DATESBETWEEN」関数は紙指定した期間のテーブルを返します。
DATESBETWEEN(<dates>, <start_date>, <end_date>)
同様の機能を持つ「DATESINPERIOD」に置き換えてみます。
DATESINPERIOD(<dates>, <start_date>, <number_of_intervals>, <interval>)
「end_date」は指定せず、「start_date」からいつまで、という形で期間を指定します。
今回は「7」とします。
平均気温(℃) 移動平均 2a =
IF(
ISFILTERED('sapporo_temp_data'[年月日]),
ERROR("タイム インテリジェンスのクイック メジャーは、Power BI が指定する日付階層またはプライマリの日付列でのみグループ化またはフィルターできます。"),
VAR __LAST_DATE = LASTDATE('sapporo_temp_data'[年月日].[Date])
RETURN
AVERAGEX(
DATESINPERIOD(
'sapporo_temp_data'[年月日].[Date],
__LAST_DATE, -7, DAY
),
CALCULATE(SUM('sapporo_temp_data'[平均気温(℃)]))
)
)
![](https://assets.st-note.com/img/1702031726-QPrbRo10k3.png?width=1200)
ふと気になり、「CALCULATE」関数を先頭にした場合を試してみました。
(実際にはうまくいかず、何度もトライ&エラーを繰り返しています)
平均気温(℃) 移動平均 2c =
VAR __LAST_DATE = LASTDATE('sapporo_temp_data'[年月日].[Date])
RETURN
CALCULATE(DIVIDE(SUM('sapporo_temp_data'[平均気温(℃)]), 7),
DATESBETWEEN(
'sapporo_temp_data'[年月日].[Date],
DATEADD(LASTDATE('sapporo_temp_data'[年月日].[Date]), -6, DAY),
__LAST_DATE
)
)
「7日間の合計値を7で割る」という式に対し、集計範囲は「DATESBETWEEN」指定しています。
今回使った式では、未来の日付分まで集計されていました。
10月22日が最新の日付の場合、その日を開始日とした7日間移動平均まで計算(10月28日までプロット)しているようです。
「平均気温(℃)が空白でない範囲のみ表示」と設定することで対処しました。
![](https://assets.st-note.com/img/1702031727-D9mEizyxWA.png?width=1200)
![](https://assets.st-note.com/img/1702031728-McNars8FUz.png?width=1200)
![](https://assets.st-note.com/img/1702031729-F8XF94sXnq.png?width=1200)