重要
从 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 密钥保管库。 有关详细信息,请参阅 Azure AI 服务安全性一文。
数据源隐私和身份验证
注意
请注意组织的数据隐私和访问政策。 有关详细信息,请参阅 Power BI Desktop 隐私级别。
在尝试运行此查询时,可能会出现警告消息,因为此查询使用外部数据源。
若要修复此问题,请选择“文件”,然后选择“选项和设置”。 然后选择“选项”。 在“当前文件”下选择“隐私”,然后选择“忽略隐私级别并潜在地改善性能”。
另外,可能会出现一条消息,要求指定连接到 API 的方式。
若要修复此问题,请选择消息中的“编辑凭据”。 在对话框出现后选择“匿名”,以匿名方式连接到 API。 然后选择“连接” 。
然后在主页功能区中选择关闭并应用以应用所做的更改。
可视化异常检测器 API 响应
在 Power BI 主屏幕中,开始使用上面创建的查询将数据可视化。 首先选择“可视化效果”中的“折线图”。 然后,将已调用函数生成的时间戳添加到折线图的坐标轴中。 右键单击它,并选择“时间戳”。
将“已调用函数”中的以下字段添加到图的“值”字段。 根据以下屏幕截图来构建图表。
- 值
- UpperMargins
- LowerMargins
- 预期值
添加字段后,选择图表并重设其大小,以显示所有数据点。 图表的外观应类似于以下屏幕截图:
显示异常数据点
在 Power BI 窗口右侧的“字段”窗格下面,右键单击“已调用函数查询”下的“值”,然后选择“新建快速度量”。
在出现的屏幕上,选择“筛选的值”作为计算方法。 将基础值设置为Sum of Value。 然后将 IsAnomaly 从“已调用函数”字段拖至“筛选器”。 从“筛选器”下拉菜单中选择 True。
选择“确定”后,会在字段列表底部出现一个 Value for True 字段。 右键单击它,将其重命名为“异常”。 将其添加到图表的“值”中。 然后选择“格式”工具,将 X 轴类型设置为“分类”。
为图表应用颜色,方法是:选择“格式”工具和“数据颜色”。 图表的外观应如下所示: