教程:使用批量检测和 Power BI 将异常可视化(单变量)
重要
从 2023 年 9 月 20 日开始,将无法创建新的异常检测器资源。 异常检测器服务将于 2026 年 10 月 1 日停用。
使用本教程查找设置为批的时序数据中的异常。 使用 Power BI Desktop 时,需获取一个 Excel 文件,为异常检测器 API 准备数据,然后将其中的统计异常可视化。
本教程介绍以下操作:
- 使用 Power BI Desktop 导入和转换时序数据集
- 将 Power BI Desktop 与异常检测器 API 集成,以便进行批量异常检测
- 将在数据中发现的异常可视化,其中包括预期的和看到的值,以及异常检测边界。
先决条件
- Azure 订阅
- 免费提供的 Microsoft Power BI Desktop。
- 一个 Excel 文件 (.xlsx),其中包含时序数据点。
- 拥有 Azure 订阅后,可在 Azure 门户中创建异常检测器资源来获取密钥和终结点。
- 需要从创建的资源获取密钥和终结点,以便将应用程序连接到异常检测器 API。 稍后会在本快速入门中执行此操作。
注意
为了在使用异常检测器 API 时达到最佳效果,JSON 格式的时间序列数据应包括:
- 以相同间隔分隔的数据点,缺少的所需点数不超过 10%。
- 如果数据不具有明确的季节性模式,则至少有 12 个数据点。
- 如果数据具有明确的季节性模式,则至少有 4 个模式匹配项。
加载时序数据并设置其格式
打开 Power BI Desktop 并加载你在先决条件部分下载的时序数据即可开始。 此 Excel 文件包含一系列协调世界时 (UTC) 时间戳和值对。
注意
Power BI 可以使用各种源(例如 .csv 文件、SQL 数据库、Azure Blob 存储等)提供的数据。
在 Power BI Desktop 主窗口中,选择“开始”功能区。 在功能区的“外部数据”组中,打开“获取数据”下拉菜单,然后选择“Excel”。
对话框出现以后,导航到下载了示例 .xlsx 文件的文件夹,然后将其选中。 在“导航器”对话框出现以后,选择“Sheet1”,然后选择“编辑”。
Power BI 会将第一列中的时间戳转换为 Date/Time
数据类型。 这些时间戳必须转换为文本才能发送到异常检测器 API。 如果 Power Query 编辑器没有自动打开,请选择主页选项卡上的“编辑查询”。
选择 Power Query 编辑器中的“转换”功能区。 在“任何列”组中,打开“数据类型:”下拉菜单,然后选择“文本”。
获得有关更改列类型的通知后,请选择“替换当前项”。 然后,在“主页”功能区中选择“关闭并应用”或“应用”。
创建一个函数来发送数据并设置响应的格式
若要设置数据文件的格式并将其发送到异常检测器 API,可以调用一个在上面创建的表的查询。 在 Power 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
,然后选择“调用”。
重要
完成后,请记住将密钥从代码中删除,并且永远不要公开发布该密钥。 对于生产来说,请使用安全的方式存储和访问凭据,例如 Azure Key Vault。 有关详细信息,请参阅 Azure AI 服务安全性一文。
数据源隐私和身份验证
注意
请注意组织的数据隐私和访问政策。 有关详细信息,请参阅 Power BI Desktop 隐私级别。
在尝试运行此查询时,可能会出现警告消息,因为此查询使用外部数据源。
若要修复此问题,请选择“文件”,然后选择“选项和设置”。 然后选择“选项”。 在“当前文件”下选择“隐私”,然后选择“忽略隐私级别并潜在地改善性能”。
另外,可能会出现一条消息,要求指定连接到 API 的方式。
若要修复此问题,请选择消息中的“编辑凭据”。 在对话框出现后选择“匿名”,以匿名方式连接到 API。 然后选择“连接” 。
然后在“主页”功能区中选择“关闭并应用”,应用所做的更改。
可视化异常检测器 API 响应
在 Power BI 主屏幕中,开始使用上面创建的查询将数据可视化。 首先选择“可视化效果”中的“折线图”。 然后,将已调用函数中的时间戳添加到折线图的“轴”。 右键单击它,并选择“时间戳”。
将“已调用函数”中的以下字段添加到图的“值”字段。 根据以下屏幕截图来构建图表。
- 值
- UpperMargins
- LowerMargins
- ExpectedValues
添加字段后,选择图表并重设其大小,以显示所有数据点。 图表的外观应类似于以下屏幕截图:
显示异常数据点
在 Power BI 窗口右侧的“字段”窗格下面,右键单击“已调用函数查询”下的“值”,然后选择“新建快速度量”。
在出现的屏幕上,选择“筛选的值”进行计算。 将“基础值”设置为Sum of Value
。 然后将 IsAnomaly
从“已调用函数”字段拖至“筛选器”。 从“筛选器”下拉菜单中选择 True
。
选择“确定”后,会在字段列表底部出现一个 Value for True
字段。 右键单击它,将其重命名为“异常”。 将其添加到图表的“值”。 然后选择“格式”工具,将 X 轴类型设置为“分类”。
为图表应用颜色,方法是:选择“格式”工具和“数据颜色”。 图表的外观应如下所示: