Передача «списка» в вызов функции с ключевым словом «each» - PullRequest
3 голосов
/ 03 мая 2020

Перво-наперво, признаюсь, я не эксперт по M или Power Query, хотя у меня есть некоторый опыт работы с Power BI.

Я пытаюсь разработать портфель акций, который будет отслеживать настроенный список акций с их ценовой историей и другими показателями. Часть моего кода основана на следующем блоге из-за проблемы, которую я пытаюсь решить:

https://datachant.com/2016/08/09/sentiment-analysis-power-bi-part-2/

У меня есть следующая функция getPriceMetrics в моем проекте, который будет принимать один параметр Sym и возвращать метрики цены для отдельного символа акции:

(Sym as any) => let
    Source = Json.Document(Web.Contents("
        https://finnhub.io/api/v1/stock/metric?metric=price&token=ABCXYZ&symbol=" & Sym))
in
    Source

Параметр Sym основан на «Запросе», который содержит список символов акции ,

Сама функция работает хорошо, когда я пытаюсь вызвать ее одним отдельным символом. Но я хотел бы запустить функцию со списком биржевых символов - отсюда и блог выше.

Я думаю, что решение, предложенное в блоге, хорошо послужит моей цели. Единственное затруднение в том, что я не могу правильно выполнить вызов функции с ключевым словом each, я думаю:

Table.Group(#"Renamed Columns", {"Index"},
    {{"Data", each getPriceMetrics(_), type record}})

В этот момент я получаю следующую ошибку.

Произошла ошибка в запросе getPriceMetrics. Expression.Error: Мы не можем применить оператор & к типам Text и Table. Детали:
Оператор = &
Слева = https://finnhub.io/api/v1/stock/metric?metric=price&token=ABCXYZ&symbol=
Справа = [Таблица]

Буду признателен, если кто-то может предложить Любое понимание того, как предоставить аргумент списка для вызова функции при использовании ключевого слова each.

Редактировать: вот мой оригинальный подход, который работает с технической точки зрения, но из-за ограничения 30 вызовов API на во-вторых, некоторые записи возвращаются как нулевые.

let
Source = Excel.Workbook(File.Contents("C:\Users\Sikander\Google Drive\Docs\Finance\Investments\Questrade\FIRE_strategy.xlsx"), null, true),
Portfolio_Sheet = Source{[Item="Portfolio",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Portfolio_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Symbol", type text}, {"Company", type text}}),
#"Invoked Custom Function" = Table.AddColumn(#"Changed Type", "getPriceMetrics", each getPriceMetrics([Symbol])) 
in #"Invoked Custom Function"

Чтобы противостоять этому, я следовал подходу, предложенному в блоге, который позволит «обмануть» этот предел API, так сказать, путем индексации и группировки , вот так:

let
Source = Excel.Workbook(File.Contents("C:\Users\Sikander\Google Drive\Docs\Finance\Investments\Questrade\FIRE_strategy.xlsx"), null, true),
Portfolio_Sheet = Source{[Item="Portfolio",Kind="Sheet"]}[Data],
#"Promoted Headers" = Table.PromoteHeaders(Portfolio_Sheet, [PromoteAllScalars=true]),
#"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Symbol", type text}, {"Company", type text}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
#"Integer-Divided Column" = Table.TransformColumns(#"Added Index", {{"Index", each Number.IntegerDivide(_, 10), Int64.Type}}),
#"Renamed Columns" = Table.RenameColumns(#"Integer-Divided Column",{{"Symbol", "Ticker"}}),
#"Grouped Rows" = Table.Group(#"Renamed Columns", {"Index"}, {{"Data", each getPriceMetrics(_), type record}})

в # "Сгруппированные строки"

1 Ответ

4 голосов
/ 03 мая 2020

Ошибка возникает из-за того, что вы передаете в свою функцию таблицу вместо фиксированного символа. Эта таблица является подтаблицей #"Renamed Columns" для определенного (одиночного) Index значения. В зависимости от того, какая у вас таблица, вы можете выбрать отдельный элемент из этой таблицы для передачи в функцию. Вот как это выглядело бы, если бы вы взяли первую строку {0} и [Index] столбец каждой таблицы _.

Table.Group(#"Renamed Columns", {"Index"},
    {{"Data", each getPriceMetrics(_{0}[Index]), type record}})

Однако я не думаю, что есть веские причины для этого Table.Group вообще. Если ваш «Запрос» является списком, вы можете просто написать следующее, чтобы применить функцию к каждому элементу:

List.Transform(Query, each getPriceMetrics(_))

Если «Запрос» - это таблица со столбцом [Sym], вы можете заменить Query с Query[Sym] в приведенном выше примере, поскольку столбец таблицы является списком.

В качестве альтернативы можно добавить настраиваемый столбец в редакторе запросов GUI с простой формулой getPriceMetrics([Sym]), и он создаст шаг со следующим кодом:

Table.AddColumn(#"Previous Step Name Here", "Custom", each getPriceMetrics([Sym]))

Редактировать: В этом моем недавнем ответе есть несколько скриншотов работы с функциями в редакторе запросов, которые также актуальны и здесь:

Power Query: как добавить один в столбец, когда заданные значения c появляются в другом столбце


Редактировать 2: Как указано в комментариях ниже, решение этой конкретной проблемы не имеет ничего общего с получением правильного синтаксиса, но требует функции сна, как я указал в этом связанном посте .

Table.AddColumn(#"Changed Type", "PriceMetrics",
    each Function.InvokeAfter(()=>getPriceMetrics([Symbol]),#duration(0,0,0,1)))`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...