你可以用 Power BI 和 Narwhal API 把节假日、发布日期、经济数据、大宗商品、汇率和预测市场赔率拉取到报表中。在 Power BI Desktop 中使用 Power Query M,然后在 Power BI 服务中为数据集安排定时刷新。
你将完成的设置
报表查询在 Power BI Desktop 中设置,每个要用的数据领域最终都有各自的查询。示例包括 Holidays、Releases、Cpi、Brent、Fx 和 Fed。把 Holidays 用作日期表,把 Brent 价格和汇率用作度量值。
Narwhal API 用同一个账户和同一个 API 密钥覆盖其各个数据 API。REST 和 MCP 共用这个密钥。在 Power BI 中,请求使用 REST,基础 URL 为 https://api.narwhalapi.com,并带上 Authorization 标头。
设置你的 API 密钥
- 创建免费密钥 在 narwhalapi.com/signup 创建你的免费密钥。这个密钥用于你想导入 Power BI 的各个数据领域。
- 保存密钥 把密钥保存在名为
NARWHAL_API_KEY的环境变量中。在 M 示例里,把标头中的YOUR_KEY替换成你的密钥;标头必须写成Authorization: Bearer YOUR_KEY,并用你自己的值替换占位符。
提供的 M 在 Headers 中直接使用密钥。标头里放的是 Web.Contents 所用的 Bearer 值;环境变量是让你把密钥保存在查询之外的地方。为 Power BI 准备查询时,把你的密钥粘贴到占位符处。
在 Power BI Desktop 中打开空白查询
- 从 Get Data 开始 在 Power BI Desktop 中,使用 Get Data 并打开 Blank Query。你将在这里添加用于 API 请求的 Power Query M。
- 在 Advanced Editor 中粘贴 M 打开 Advanced Editor,并粘贴下一节中的 M 示例。该示例返回 Holidays;实际使用时,其他每个数据领域都是各自独立的查询。
- 使用 Anonymous 身份验证 把网页数据源设置为 Anonymous 身份验证。API 密钥放在 M 查询提供的请求标头中。
用代码获取数据
把这段 Power Query M 粘贴到 Advanced Editor 中。Narwhal 辅助函数接受一个路径和一个可选的查询记录,调用 Web.Contents,并读取 JSON 响应。然后每个领域选取各自的响应字段。Table.FromRecords 把记录集合转成表,而 Brent 表达式用 Number.FromText 读取 price。
let
Narwhal = (path as text, optional query as record) =>
Json.Document(Web.Contents("https://api.narwhalapi.com", [
RelativePath = path,
Query = if query = null then [] else query,
Headers = [Authorization = "Bearer YOUR_KEY"]
])),
Holidays = Table.FromRecords(Narwhal("v1/calendars/holidays/USA/2026")[holidays]),
Releases = Table.FromRecords(
Narwhal(
"v1/economics/calendar",
[countries = "USA", start_date = "2026-11-01",
end_date = "2026-11-30", limit = "100"]
)[releases],
{"at", "period", "topic", "status"}, MissingField.UseNull),
Cpi = Table.FromRecords(
Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
),
Brent = Number.FromText(Narwhal("v1/commodities/spot/BRENT/USD")[price]),
Fx = Table.FromRecords(Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates]),
Fed = Table.FromRecords(
Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings]
)
in
// return Releases, Cpi, Fx or Fed the same way;
// each area is its own query in practice
Holidaysin 之后的表达式选择查询返回的结果。要得到节假日表就保持 Holidays,要得到其他表就返回 Releases、Cpi、Fx 或 Fed。要得到价格就返回 Brent。准备每个独立查询时都要保留这个辅助函数;各领域示例使用的是同一个辅助函数。
按计划定时运行
在 Power BI 服务中为数据集安排定时刷新。使用固定基础 URL、RelativePath 和 Query 的 Web.Contents 数据集可以按计划刷新。请在报表所用的查询中保持这种请求结构。
示例把 https://api.narwhalapi.com 放在 Web.Contents 中,把各端点路径放在 RelativePath 中,把请求参数放在 Query 中。节假日表、CPI 观测值和其他领域采用同样的结构。更多调度说明请参阅安排每日数据拉取。
Power BI 中的节假日
把 2026 年 USA 的节假日查询用作你的 Holidays 日期表。读取 holidays 集合,其记录包含 date 和 name。只要在查询中保留 Narwhal 辅助函数,这个表达式就会把节假日记录作为表返回。
Table.FromRecords(
Narwhal("v1/calendars/holidays/USA/2026")[holidays]
)Power BI 中的发布日期
拉取 2026 年 11 月 USA 的经济发布日历。读取 releases,并保留 at、period、topic 和 status 字段。这个请求在查询记录中使用 countries、start_date、end_date 和 limit;表表达式沿用完整示例中的字段列表。
Table.FromRecords(
Narwhal(
"v1/economics/calendar",
[countries = "USA", start_date = "2026-11-01",
end_date = "2026-11-30", limit = "100"]
)[releases],
{"at", "period", "topic", "status"}, MissingField.UseNull)Power BI 中的经济数据
请求 USA CPI 观测值,并把 start 设为 2025-09。响应字段是 observations,每个观测值都有 period 和 value。用 Cpi 查询把这些记录作为表返回,并让 start 参数保留在辅助函数的查询记录中。
所有账户都可读取完整历史。如果序列在请求的开始日期之后才开始,响应将从其第一个观测值开始。
Table.FromRecords(
Narwhal("v1/economics/USA/cpi/observations", [start = "2025-09"])[observations]
)Power BI 中的大宗商品
请求以 USD 计价的 Brent 现货价格并读取 price。Brent 表达式用 Number.FromText 转换这个字段;把得到的价格用作度量值。大宗商品现货代码包括 XAU、XAG、XPT、XPD、XCU、BRENT 和 WTI 等。
Number.FromText(
Narwhal("v1/commodities/spot/BRENT/USD")[price]
)Power BI 中的汇率
通过 currencies 参数请求 EUR 和 IDR 对 USD 的汇率。读取 rates 集合,其中每条记录都有 currency 和 rate。把 Fx 作为表返回给报表,并把汇率用作度量值。
Table.FromRecords(
Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates]
)Power BI 中的预测
把美联储政策利率路径的预测市场赔率拉取到 Fed 查询中。从响应中读取 meetings,并把这些记录转成表。每次会议都有 resolves_at、p_cut、p_hold 和 p_hike,所以请让返回的表保留这些字段。
Table.FromRecords(
Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings]
)为什么要使用固定的基础 URL?
Power BI 在服务中刷新时会使用基础 URL。请保持基础 URL 固定,把端点路径放在 RelativePath 中,把参数放在 Query 中。例如,发布日历的国家和日期参数应放在传给辅助函数的查询记录中。
在报表中共享 API 密钥安全吗?
密钥保存在查询中,所以只能把报表共享给有权看到密钥的人。这里使用的网页数据源设置是 Anonymous 身份验证;请求仍会在其 Authorization 标头中发送 API 密钥。
发布于。