Sik*_*der 3 m powerquery powerbi
首先,我承认我不是 M 或 Power Query 专家,尽管我确实有一些 Power BI 经验。
\n\n我正在尝试开发一个股票投资组合,该投资组合将跟踪定制的股票列表及其价格历史记录和其他指标。由于我试图解决的问题,我的部分代码基于以下博客:
\n\nhttps://datachant.com/2016/08/09/sentiment-analysis-power-bi-part-2/
\n\ngetPriceMetrics我的项目中有以下函数,该函数将采用一个参数Sym并返回单个股票代码的价格指标:
(Sym as any) => let\n Source = Json.Document(Web.Contents("\n https://finnhub.io/api/v1/stock/metric?metric=price&token=ABCXYZ&symbol=" & Sym))\nin\n Source\nRun Code Online (Sandbox Code Playgroud)\n\n参数Sym基于包含股票代码列表的“查询”。
当我尝试用一个单独的符号调用该函数时,该函数本身运行良好。但我想针对股票代码列表运行该函数 - 因此是上面的博客。
\n\n我认为博客中提供的解决方案可以很好地满足我的目的。唯一的问题是我无法使用each,我认为:
Table.Group(#"Renamed Columns", {"Index"},\n {{"Data", each getPriceMetrics(_), type record}})\nRun Code Online (Sandbox Code Playgroud)\n\n此时,我收到以下错误。
\n\n\n\n\n\xe2\x80\x98getPriceMetrics\xe2\x80\x99 查询中发生错误。Expression.Error:我们无法将运算符 & 应用于类型 Text 和 Table。详细信息:
\n
\n 运算符 = &
\n 左 = https://finnhub.io/api/v1/stock/metric?metric=price&token=ABCXYZ&symbol=
\n 右 = [表格]
如果有人能够提供有关如何在使用时向函数调用提供列表参数的任何见解,我将不胜感激each。
编辑:这是我原来的方法,从技术上讲是可行的,但由于每秒 30 次 API 调用的限制,一些记录返回为 null。
\n\nlet\nSource = Excel.Workbook(File.Contents("C:\\Users\\Sikander\\Google Drive\\Docs\\Finance\\Investments\\Questrade\\FIRE_strategy.xlsx"), null, true),\nPortfolio_Sheet = Source{[Item="Portfolio",Kind="Sheet"]}[Data],\n#"Promoted Headers" = Table.PromoteHeaders(Portfolio_Sheet, [PromoteAllScalars=true]),\n#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Symbol", type text}, {"Company", type text}}),\n#"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "getPriceMetrics", each getPriceMetrics([Symbol])) \nin #"Invoked Custom Function"\nRun Code Online (Sandbox Code Playgroud)\n\n为了解决这个问题,我遵循了博客中建议的方法,可以说,通过索引和分组来“欺骗”此 API 限制,如下所示:
\n\nlet\nSource = Excel.Workbook(File.Contents("C:\\Users\\Sikander\\Google Drive\\Docs\\Finance\\Investments\\Questrade\\FIRE_strategy.xlsx"), null, true),\nPortfolio_Sheet = Source{[Item="Portfolio",Kind="Sheet"]}[Data],\n#"Promoted Headers" = Table.PromoteHeaders(Portfolio_Sheet, [PromoteAllScalars=true]),\n#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Symbol", type text}, {"Company", type text}}),\n#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),\n#"Integer-Divided Column" = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, 10), Int64.Type}}),\n#"Renamed Columns" = Table.RenameColumns(#"Integer-Divided Column",{{"Symbol", "Ticker"}}),\n#"Grouped Rows" = Table.Group(#"Renamed Columns", {"Index"}, {{"Data", each getPriceMetrics(_), type record}})\nRun Code Online (Sandbox Code Playgroud)\n\n在#“分组行”中
\n发生错误是因为您将表而不是固定符号传递给函数。#"Renamed Columns"该表是特定(单个)值的子表Index。根据您的表是什么,您也许可以从该表中选择单个元素来传递给函数。如果您获取每个表的第一行{0}和第一列,则结果如下所示。[Index]_
Table.Group(#"Renamed Columns", {"Index"},
{{"Data", each getPriceMetrics(_{0}[Index]), type record}})
Run Code Online (Sandbox Code Playgroud)
然而,我认为根本没有充分的理由Table.Group这样做。如果您的“查询”是一个列表,那么您只需编写以下内容即可将函数应用于每个元素:
List.Transform(Query, each getPriceMetrics(_))
Run Code Online (Sandbox Code Playgroud)
如果“查询”是一个带有列的表,[Sym]您可以在上面替换Query为,因为表列是一个列表。Query[Sym]
或者,您可以使用简单的公式在查询编辑器 GUI 中添加自定义列getPriceMetrics([Sym]),它将使用以下代码创建一个步骤:
Table.AddColumn(#"Previous Step Name Here", "Custom", each getPriceMetrics([Sym]))
Run Code Online (Sandbox Code Playgroud)
编辑:我最近的回答有一些在查询编辑器中使用函数的屏幕截图,这些函数也与这里相关:
Power Query:当特定值出现在另一列中时如何向列添加一个
编辑2:正如下面的评论所指出的,这个特定问题的解决方案并不需要使语法完全正确,而是需要睡眠功能,正如我在这个链接帖子中指出的那样。
Table.AddColumn(#"Changed Type", "PriceMetrics",
each Function.InvokeAfter(()=>getPriceMetrics([Symbol]),#duration(0,0,0,1)))`
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |