优化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
- XPath1:
最终代码
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
代码关键点解释
- XPath精准定位:通过
Web.Page的第二个参数指定XPath,直接抓取目标表格,避免加载页面中无关内容,大幅提升性能 - 空行移除:用
Table.SelectRows过滤Date或Value为空的行,确保数据干净 - 宽表转换:使用
List.Accumulate逐步按Date列合并所有公司的表格,最后展开得到单日期列+多公司数值列的格式 - 数据类型处理:将Date转为日期类型,Value转为数值类型,方便后续分析
内容的提问来源于stack exchange,提问作者yosuhite
相关产品推荐
相关产品推荐

