教學課程:使用批次偵測和 Power BI 將異常可視化(單變數)

重要

從 2023 年 9 月 20 日開始,您將無法建立新的 異常偵測程式 資源。 異常偵測程式 服務將於 2026 年 10 月 1 日淘汰。

使用本教學課程,以批次的形式尋找時間序列數據集內的異常狀況。 使用 Power BI Desktop 時,您將會取得 Excel 檔案、準備 異常偵測程式 API 的數據,以及將整個 API 的統計異常可視化。

在本教學課程中,您將了解如何:

  • 使用 Power BI Desktop 匯入和轉換時間序列資料集
  • 整合 Power BI Desktop 與 異常偵測程式 API 以進行批次異常偵測
  • 將數據中找到的異常狀況可視化,包括預期值和可見值,以及異常偵測界限。

必要條件

注意

若要在使用 異常偵測程式 API 時獲得最佳結果,JSON 格式的時間序列資料應包含:

  • 以相同間隔分隔的數據點,未超過預期遺漏點數目的 10%。
  • 如果您的數據沒有明確的季節性模式,則至少 12 個數據點。
  • 如果您的數據確實有明確的季節性模式,則至少會發生 4 個模式。

載入和格式化時間序列數據

若要開始使用,請開啟Power BI Desktop,然後載入您從必要條件下載的時間序列數據。 這個 Excel 檔案包含一系列國際標準時間 (UTC) 時間戳和值組。

注意

Power BI 可以使用來自各種來源的數據,例如 .csv 檔案、SQL 資料庫、Azure Blob 記憶體等等。

在主要 Power BI Desktop 視窗中,選取 [首頁 ] 功能區。 在功能區的 [外部數據] 群組中,開啟 [取得數據] 下拉功能表,然後選取 [Excel]。

An image of the

對話框出現之後,流覽至您下載範例 .xlsx 檔案的資料夾,然後加以選取。 在 [導覽器] 對話框出現之後,選取 [Sheet1],然後選取 [編輯]。

An image of the data source

Power BI 會將第一個 Date/Time 數據行中的時間戳轉換成數據類型。 這些時間戳必須轉換成文字,才能傳送至 異常偵測程式 API。 如果 Power Query 編輯器未自動開啟,請選取 [首頁] 索引卷標上的 [ 編輯查詢 ]。

選取 Power Query 編輯器 中的 [轉換] 功能區。 在 [ 任何數據行] 群組中 ,開啟 [數據類型: ] 下拉功能表,然後選取 [ 文字]。

An image of the data type drop down

當您收到變更數據行類型的通知時,請選取 [ 取代目前]。 之後,選取 [首頁] 功能區中的 [關閉及套用] 或 [套用]。

建立函式以傳送數據並格式化回應

若要格式化數據檔並將數據檔傳送至 異常偵測程式 API,您可以在上面建立的數據表上叫用查詢。 在 Power Query 編輯器 中,從 [首頁] 功能區開啟 [新增來源] 下拉功能表,然後選取 [空白查詢]。

請確定已選取新的查詢,然後選取 [進階編輯器]。

An image of the

在 進階編輯器 內,使用下列 Power Query M 代碼段,從數據表擷取數據行,並將其傳送至 API。 之後,查詢會從 JSON 回應建立數據表,並傳回它。 將 apiKey 變數取代為您的有效 異常偵測程式 API 金鑰,並將 endpoint 取代為您的端點。 將查詢輸入 進階編輯器 之後,請選取 [完成]。

(table as table) => let

    apikey      = "[Placeholder: Your Anomaly Detector resource access key]",
    endpoint    = "[Placeholder: Your Anomaly Detector resource endpoint]/anomalydetector/v1.0/timeseries/entire/detect",
    inputTable = Table.TransformColumnTypes(table,{{"Timestamp", type text},{"Value", type number}}),
    jsontext    = Text.FromBinary(Json.FromValue(inputTable)),
    jsonbody    = "{ ""Granularity"": ""daily"", ""Sensitivity"": 95, ""Series"": "& jsontext &" }",
    bytesbody   = Text.ToBinary(jsonbody),
    headers     = [#"Content-Type" = "application/json", #"Ocp-Apim-Subscription-Key" = apikey],
    bytesresp   = Web.Contents(endpoint, [Headers=headers, Content=bytesbody, ManualStatusHandling={400}]),
    jsonresp    = Json.Document(bytesresp),

    respTable = Table.FromColumns({

                     Table.Column(inputTable, "Timestamp")
                     ,Table.Column(inputTable, "Value")
                     , Record.Field(jsonresp, "IsAnomaly") as list
                     , Record.Field(jsonresp, "ExpectedValues") as list
                     , Record.Field(jsonresp, "UpperMargins")as list
                     , Record.Field(jsonresp, "LowerMargins") as list
                     , Record.Field(jsonresp, "IsPositiveAnomaly") as list
                     , Record.Field(jsonresp, "IsNegativeAnomaly") as list

                  }, {"Timestamp", "Value", "IsAnomaly", "ExpectedValues", "UpperMargin", "LowerMargin", "IsPositiveAnomaly", "IsNegativeAnomaly"}
               ),

    respTable1 = Table.AddColumn(respTable , "UpperMargins", (row) => row[ExpectedValues] + row[UpperMargin]),
    respTable2 = Table.AddColumn(respTable1 , "LowerMargins", (row) => row[ExpectedValues] -  row[LowerMargin]),
    respTable3 = Table.RemoveColumns(respTable2, "UpperMargin"),
    respTable4 = Table.RemoveColumns(respTable3, "LowerMargin"),

    results = Table.TransformColumnTypes(

                respTable4,
                {{"Timestamp", type datetime}, {"Value", type number}, {"IsAnomaly", type logical}, {"IsPositiveAnomaly", type logical}, {"IsNegativeAnomaly", type logical},
                 {"ExpectedValues", type number}, {"UpperMargins", type number}, {"LowerMargins", type number}}
              )

 in results

選取 [輸入參數] 下方,然後選取 Sheet1 [用],在您的數據工作表上叫用查詢。

An image of the invoke function

重要

當您完成時,請記得從程式碼中移除密鑰,且絕不會公開發佈。 針對生產環境,請使用安全的方式來儲存和存取您的認證,例如 Azure 金鑰保存庫。 如需詳細資訊,請參閱 Azure AI 服務安全性一文。

數據源隱私權和驗證

注意

請留意貴組織的數據隱私權和存取原則。 如需詳細資訊,請參閱 Power BI Desktop 隱私權層級

當您嘗試執行查詢時,可能會收到警告訊息,因為它會利用外部數據源。

An image showing a warning created by Power BI

若要修正此問題,請選取 [檔案] 和 [選項和設定]。 然後選取 [ 選項]。 在 [目前檔案] 下方,選取 [隱私權],然後忽略 [隱私權等級],並可能改善效能

此外,您可能會收到訊息,要求您指定連線至 API 的方式。

An image showing a request to specify access credentials

若要修正此問題,請選取 訊息中的 [編輯認證 ]。 對話框出現之後,選取 [匿名 ] 以匿名方式連線至 API。 然後選取 [連線]。

之後,選取 [首頁] 功能區中的 [關閉及套用] 以套用變更。

可視化 異常偵測程式 API 回應

在主要 Power BI 畫面中,開始使用上述建立的查詢將數據可視化。 首先選取 [視覺效果] 中的折線圖。 然後將叫用函式的時間戳新增至折線圖的 Axis。 以滑鼠右鍵按兩下它,然後選取 [時間戳]。

Right-clicking the Timestamp value

將下列欄位從叫用函式新增至圖表的 [值] 字段。 使用下列螢幕快照來協助建置您的圖表。

  • UpperMargins
  • LowerMargins
  • ExpectedValues

An image of the chart settings

新增欄位之後,請在圖表上選取並重設大小以顯示所有數據點。 您的圖表看起來會類似下列螢幕快照:

An image of the chart visualization

顯示異常數據點

在 Power BI 視窗右側的 [字段] 窗格下方,以滑鼠右鍵按兩下 [叫用函數查詢] 底下的 [值],然後選取 [新增快速量值]。

An image of the new quick measure screen

在出現的畫面上,選取 [ 已篩選的值 ] 作為計算。 將 [基底值] 設定Sum of Value。 然後從 [叫用的函式] 字段拖曳IsAnomaly[篩選]。 從 [篩選] 下拉選單中選取 True

A second image of the new quick measure screen

選取 [ 確定] 之後,您會在字段清單底部有欄位 Value for True 。 以滑鼠右鍵按兩下它,並將它重新命名為 Anomaly。 將它新增至圖表的 [值]。 然後選取 [ 格式] 工具,然後將 X 軸類型設定為 類別

An image of the format x axis

選取 [格式 ] 工具和 [數據色彩],將色彩套用至您的圖表。 您的圖表看起來應該如下所示:

An image of the final chart