You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化Power Query M代码:消除空行、日期数据并行展示及提速

优化后的Power Query M代码(抓取YCharts资管规模并生成宽表)

需求说明

  • 移除输出中的空行
  • 将数据转换为单日期列 + 10家公司对应数值列的宽表格式
  • 通过指定XPath仅抓取目标表格,避免下载整站数据以提升性能:
    • XPath1: /html/body/main/div/div[4]/div/div/div/div[3]/div[1]/div/div[2]/div[2]/div[1]/table
    • XPath2: /html/body/main/div/div[4]/div/div/div/div[3]/div[1]/div/div[2]/div[2]/div[2]/table

最终代码

let
    // 定义目标公司代码列表
    Slugs = {
        "IBIT", "FBTC", "BITB", "ARKB", "BTCO",
        "EZBC", "BRRR", "HODL", "BTCW", "GBTC"
    },

    // 构造每个公司的目标URL
    ConstructURL = (Slug) => "https://ycharts.com/companies/" & Slug & "/total_assets_under_management",

    // 单公司数据抓取与处理函数
    TransformSingleCompany = (URL) =>
    let
        // 通过XPath直接定位目标表格,避免加载整站数据
        WebContent = Web.Contents(URL),
        // 抓取第一个目标表格
        Table1 = Web.Page(WebContent, [XPath="/html/body/main/div/div[4]/div/div/div/div[3]/div[1]/div/div[2]/div[2]/div[1]/table"]){0}[Data],
        // 抓取第二个目标表格
        Table2 = Web.Page(WebContent, [XPath="/html/body/main/div/div[4]/div/div/div/div[3]/div[1]/div/div[2]/div[2]/div[2]/table"]){0}[Data],
        // 合并两个表格
        CombinedTables = Table.Combine({Table1, Table2}),
        // 移除空行(过滤Date或Value为空的行)
        RemoveEmptyRows = Table.SelectRows(CombinedTables, each not (isnull([Date]) or [Date] = "" or isnull([Value]) or [Value] = "")),
        // 提取公司名称
        CompanyName = Text.BetweenDelimiters(URL, "companies/", "/"),
        // 重命名Value列为公司名称,设置数据类型
        RenameAndType = Table.TransformColumnTypes(
            Table.RenameColumns(RemoveEmptyRows, {{"Value", CompanyName}}),
            {{"Date", type date}, {CompanyName, type number}}
        )
    in
        RenameAndType,

    // 生成所有公司的URL列表
    URLs = List.Transform(Slugs, ConstructURL),
    // 批量处理所有公司数据
    AllCompanyTables = List.Transform(URLs, TransformSingleCompany),
    // 按Date列合并所有表格(自动匹配日期,缺失值留空)
    MergedWideTable = List.Accumulate(
        AllCompanyTables,
        AllCompanyTables{0},
        (state, current) => Table.NestedJoin(
            state, {"Date"}, current, {"Date"}, current{0}[#"Name"], JoinKind.LeftOuter
        )
    ),
    // 展开所有公司列
    ExpandedColumns = Table.ExpandTableColumn(
        MergedWideTable,
        MergedWideTable{0}[#"Name"],
        List.RemoveFirstN(Table.ColumnNames(MergedWideTable{0}), 1)
    )
in
    ExpandedColumns

代码关键点解释

  1. XPath精准定位:通过Web.Page的第二个参数指定XPath,直接抓取目标表格,避免加载页面中无关内容,大幅提升性能
  2. 空行移除:用Table.SelectRows过滤Date或Value为空的行,确保数据干净
  3. 宽表转换:使用List.Accumulate逐步按Date列合并所有公司的表格,最后展开得到单日期列+多公司数值列的格式
  4. 数据类型处理:将Date转为日期类型,Value转为数值类型,方便后续分析

内容的提问来源于stack exchange,提问作者yosuhite

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:24:52