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

Important

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

使用本教程查找设置为批的时序数据中的异常。 使用 Power BI Desktop 时,需获取一个 Excel 文件,为异常检测器 API 准备数据,然后将其中的统计异常可视化。

在本教程中,你将学习如何:

  • 使用 Power BI Desktop 导入和转换时序数据集
  • 将 Power BI Desktop 与异常检测器 API 集成,以便进行批量异常检测
  • 将在数据中发现的异常可视化,其中包括预期的和看到的值,以及异常检测边界。

Prerequisites

  • 一个 Azure 订阅
  • Power BI桌面,免费。
  • 一个 Excel 文件 (.xlsx),其中包含时序数据点。
  • 获得Azure订阅后,在Azure门户中创建异常检测器资源以获取密钥和终结点。
    • 需要从创建的资源获取密钥和终结点,以便将应用程序连接到异常检测器 API。 稍后你将在本快速入门中执行该操作。

Note

为了在使用异常检测器 API 时达到最佳效果,JSON 格式的时间序列数据应包括:

  • 以相同间隔分隔的数据点,缺少的所需点数不超过 10%。
  • 如果数据不具有明确的季节性模式,则至少有 12 个数据点。
  • 如果数据具有明确的季节性模式,则至少出现 4 次模式。

加载时序数据并设置其格式

若要开始,请打开 Power BI Desktop 并加载从先决条件下载的时序数据。 此 Excel 文件包含一系列协调世界时 (UTC) 时间戳和值对。

Note

Power BI可以使用来自各种源的数据,例如 .csv 文件、SQL 数据库、Azure blob 存储等。

在 Power BI Desktop 主窗口中,选择 主页 选项卡。 在功能区的“外部数据”组中,打开“获取数据”下拉菜单,然后选择“Excel”。

Power BI中“获取数据”按钮的图像

对话框出现以后,导航到下载了示例 .xlsx 文件的文件夹,然后将其选中。 在“导航器”对话框出现以后,选择“Sheet1”,然后选择“编辑”。

Power BI 中数据源“导航器”屏幕的图像

Power BI 会将第一列中的时间戳转换为 Date/Time 数据类型。 这些时间戳必须转换为文本才能发送到异常检测器 API。 如果Power Query编辑器未自动打开,请在主选项卡上选择Edit Queries

选择Power Query 编辑器中的 Transform 功能区。 在“任何列”组中,打开“数据类型:”下拉菜单,然后选择“文本”。

数据类型下拉列表的图像

获得有关更改列类型的通知后,请选择“替换当前项”。 然后,在主页功能区中选择关闭并应用应用

创建一个函数来发送数据并设置响应的格式

若要格式化数据文件并将其发送到异常检测器 API,可以对上面创建的表调用查询。 在 Power Query 编辑器 中,从 Home 功能区中,打开 New Source 下拉菜单,然后选择 Blank Query

确保选中新的查询,然后选择“高级编辑器”。

“高级编辑器”屏幕的图像

在高级编辑器中,使用以下 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下选择输入参数,然后选择调用

调用函数的图像

Important

完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 在生产中,请使用安全的方式存储和访问凭据,例如 Azure 密钥保管库。 有关详细信息,请参阅 Azure AI 服务安全性一文。

数据源隐私和身份验证

Note

请注意组织的数据隐私和访问政策。 有关详细信息,请参阅 Power BI 桌面隐私级别

在尝试运行此查询时,可能会出现警告消息,因为此查询使用外部数据源。

一个显示由 Power BI 创建的警告的图像

若要修复此问题,请选择“文件”,然后选择“选项和设置”。 然后选择“选项”。 在“当前文件”下选择“隐私”,然后选择“忽略隐私级别并潜在地改善性能”。

另外,可能会出现一条消息,要求指定连接到 API 的方式。

一个图像,其中显示了一条请求,要求指定访问凭据

若要修复此问题,请选择消息中的“编辑凭据”。 在对话框出现后选择“匿名”,以匿名方式连接到 API。 然后选择连接

然后在主页功能区中选择关闭并应用以应用所做的更改。

可视化异常检测器 API 响应

在 Power BI 主屏幕中,开始使用上面创建的查询将数据可视化。 首先选择“可视化效果”中的“折线图”。 然后,将已调用函数生成的时间戳添加到折线图的坐标轴中。 右键单击它,并选择“时间戳”。

右键单击时间戳值

将“已调用函数”中的以下字段添加到图的“值”字段。 根据以下屏幕截图来构建图表。

  • UpperMargins
  • LowerMargins
  • 预期值

图表设置的图像

添加字段后,选择图表并重设其大小,以显示所有数据点。 图表的外观应类似于以下屏幕截图:

图表可视化的图像

显示异常数据点

在 Power BI 窗口右侧,FIELDS 窗格下,右键单击 Invoked Function query 下的 Value,然后选择 新建快速度量值

新快速度量屏幕的图像

在出现的屏幕上,选择“筛选的值”作为计算方法。 将基础值设置为Sum of Value。 然后将 IsAnomaly 从“已调用函数”字段拖至“筛选器”。 从“筛选器”下拉菜单中选择 True

新快速测量界面的第二张图片

选择“确定”后,会在字段列表底部出现一个 Value for True 字段。 右键单击它,将其重命名为“异常”。 将其添加到图表的“值”中。 然后选择“格式”工具,将 X 轴类型设置为“分类”。

格式化 X 轴的图像

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

最终图表的图像