教程:使用批量检测和 Power BI 将异常可视化(单变量)

重要

从 2023 年 9 月 20 日开始,将无法创建新的异常检测器资源。 异常检测器服务将于 2026 年 10 月 1 日停用。

使用本教程查找设置为批的时序数据中的异常。 使用 Power BI Desktop 时,需获取一个 Excel 文件,为异常检测器 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 Key Vault。 有关详细信息,请参阅 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 主屏幕中,开始使用上面创建的查询将数据可视化。 首先选择“可视化效果”中的“折线图”。 然后,将已调用函数中的时间戳添加到折线图的“轴”。 右键单击它,并选择“时间戳”。

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 字段。 右键单击它,将其重命名为“异常”。 将其添加到图表的“值”。 然后选择“格式”工具,将 X 轴类型设置为“分类”。

An image of the format x axis

为图表应用颜色,方法是:选择“格式”工具和“数据颜色”。 图表的外观应如下所示:

An image of the final chart