在 Power BI 中使用 Narwhal API

你可以用 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 密钥

  1. 创建免费密钥 在 narwhalapi.com/signup 创建你的免费密钥。这个密钥用于你想导入 Power BI 的各个数据领域。
  2. 保存密钥 把密钥保存在名为 NARWHAL_API_KEY 的环境变量中。在 M 示例里,把标头中的 YOUR_KEY 替换成你的密钥;标头必须写成 Authorization: Bearer YOUR_KEY,并用你自己的值替换占位符。

提供的 M 在 Headers 中直接使用密钥。标头里放的是 Web.Contents 所用的 Bearer 值;环境变量是让你把密钥保存在查询之外的地方。为 Power BI 准备查询时,把你的密钥粘贴到占位符处。

在 Power BI Desktop 中打开空白查询

  1. 从 Get Data 开始 在 Power BI Desktop 中,使用 Get Data 并打开 Blank Query。你将在这里添加用于 API 请求的 Power Query M。
  2. 在 Advanced Editor 中粘贴 M 打开 Advanced Editor,并粘贴下一节中的 M 示例。该示例返回 Holidays;实际使用时,其他每个数据领域都是各自独立的查询。
  3. 使用 Anonymous 身份验证 把网页数据源设置为 Anonymous 身份验证。API 密钥放在 M 查询提供的请求标头中。

用代码获取数据

把这段 Power Query M 粘贴到 Advanced Editor 中。Narwhal 辅助函数接受一个路径和一个可选的查询记录,调用 Web.Contents,并读取 JSON 响应。然后每个领域选取各自的响应字段。Table.FromRecords 把记录集合转成表,而 Brent 表达式用 Number.FromText 读取 price。

Power Query M,六个领域
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
    Holidays

in 之后的表达式选择查询返回的结果。要得到节假日表就保持 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 辅助函数,这个表达式就会把节假日记录作为表返回。

节假日的 Power Query M
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;表表达式沿用完整示例中的字段列表。

发布日期的 Power Query M
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 参数保留在辅助函数的查询记录中。

所有账户都可读取完整历史。如果序列在请求的开始日期之后才开始,响应将从其第一个观测值开始。

CPI 的 Power Query M
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 等。

Brent 的 Power Query M
Number.FromText(
    Narwhal("v1/commodities/spot/BRENT/USD")[price]
)

Power BI 中的汇率

通过 currencies 参数请求 EUR 和 IDR 对 USD 的汇率。读取 rates 集合,其中每条记录都有 currency 和 rate。把 Fx 作为表返回给报表,并把汇率用作度量值。

汇率的 Power Query M
Table.FromRecords(
    Narwhal("v1/fx/rates/USD", [currencies = "EUR,IDR"])[rates]
)

Power BI 中的预测

把美联储政策利率路径的预测市场赔率拉取到 Fed 查询中。从响应中读取 meetings,并把这些记录转成表。每次会议都有 resolves_at、p_cut、p_hold 和 p_hike,所以请让返回的表保留这些字段。

预测的 Power Query M
Table.FromRecords(
    Narwhal("v1/predictions/policy-paths/federal-reserve")[meetings]
)

为什么要使用固定的基础 URL?

Power BI 在服务中刷新时会使用基础 URL。请保持基础 URL 固定,把端点路径放在 RelativePath 中,把参数放在 Query 中。例如,发布日历的国家和日期参数应放在传给辅助函数的查询记录中。

在报表中共享 API 密钥安全吗?

密钥保存在查询中,所以只能把报表共享给有权看到密钥的人。这里使用的网页数据源设置是 Anonymous 身份验证;请求仍会在其 Authorization 标头中发送 API 密钥。

发布于。

后续步骤