見出し画像

移動平均:Power BI Desktopのクイックメジャー


気象庁のサイトから取得した、札幌市の日毎平均気温を利用しました。
同サイトからCSVをダウンロードし、「Power BI Desktop」にインポートします。

気象庁のサイトから取得したデータを元に作成。札幌市の平均気気温。Power BI Desktopを使用2021年10月22日から2022年10月22日までのデータを取得。グラフでは2022年1月付近から表示

フィールド」→「新しいクイックメジャー」を選びます。

「新しいクイックメジャー」を選択

計算」から「」を選び、以下のように設定しました(7日間移動平均の例)。

移動平均のクイックメジャーを設定

移動平均のグラフを追加します。

平均気温と7日間移動平均のグラフ

移動平均の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'[平均気温(℃)]))
		)
)
「DATESBETWEEN」を使用した移動平均グラフ(上)と「DATESINPERIOD」を使ったグラフ(下)

ふと気になり、「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日までプロット)しているようです。
平均気温(℃)が空白でない範囲のみ表示」と設定することで対処しました。

最新日付の先まで集計(濃い色のグラフ)
「フィルター」で「平均気温(℃)」が「空白でない範囲を表示」と設定
「フィルターを適用」すると未来分が非表示になる

いいなと思ったら応援しよう!