Как получить исторические данные обменного курса из API Европейского центрального банка?

У меня возникли проблемы с получением исторических данных о курсах валют из API ЕЦБ: https://data.ecb.europa.eu/help/api/overview

Я абсолютный новичок и до сих пор мне удавалось узнать текущие курсы валют только через https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml

Конечный результат, которого я хотел бы достичь, примерно такой (курсы обмена евро):

Дата доллар США Фунт стерлингов 2024-08-29 1.09 0,92 2024-08-28 1.12 0,89

... назад к 1 января 2000 г. (или, если информация не существует так давно: настолько далеко, насколько она существует)

Я работаю в Power Query M (PowerBI).

Сейчас я использую следующий запрос, однако он не выводит то, что мне действительно нужно. Выводит это:

Название_валюты Ставка Дата доллар США 1.11 2024-08-27 Фунт стерлингов 0,84 2024-08-27
let

    url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml",
    

    Source = Xml.Tables(Web.Contents(url)),
    

    ExpandedSender = Table.ExpandTableColumn(Source, "Sender", {"name"}, {"Sender.name"}),
    ExpandedEurofxref = Table.ExpandTableColumn(ExpandedSender, "http://www.ecb.int/vocabulary/2002-08-01/eurofxref", {"Cube"}, {"Eurofxref.Cube"}),
    ExpandedCube = Table.ExpandTableColumn(ExpandedEurofxref, "Eurofxref.Cube", {"Cube"}, {"Cube.Cube"}),
    ExpandedCubeCube = Table.ExpandTableColumn(ExpandedCube, "Cube.Cube", {"Cube", "Attribute:time"}, {"Cube.Cube.Cube", "Date"}),
    ExpandedRate = Table.ExpandTableColumn(ExpandedCubeCube, "Cube.Cube.Cube", {"Attribute:currency", "Attribute:rate"}, {"Currency", "Rate"}),
    

    FilteredCurrencies = Table.SelectRows(ExpandedRate, each [Currency] = "USD" or [Currency] = "GBP"),
    

    ReplacedComma = Table.TransformColumns(FilteredCurrencies, {{"Rate", each Text.Replace(Text.From(_), ".", ","), type text}}),
    

    USDDate = Table.SelectRows(ReplacedComma, each [Currency] = "USD"){0}[Date],
    

    EURRow = Table.FromRecords({
        [Currency = "EUR", Rate = "1", Date = USDDate]
    }),
    

    CombinedTable = Table.Combine({ReplacedComma, EURRow}),
    #"Removed Columns" = Table.RemoveColumns(CombinedTable,{"subject", "Sender.name"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Currency", "Currency_name"}})
    
in
    #"Renamed Columns"

Был бы очень признателен за помощь. Спасибо большое <3 -Л

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вставьте эту последнюю процедуру в конец кода...

...
        #"Renamed Columns" = Table.RenameColumns(#"Removed Columns",{{"Currency", "Currency_name"}}),
        #"Coluna em pivô" = Table.Pivot(#"Renamed Columns", List.Distinct(#"Renamed Columns"[Currency_name]), "Currency_name", "Rate", List.Max)
    in
        #"Coluna em pivô"

Спасибо! Это изменило столбцы и строки на тот формат, который я описал в своем исходном сообщении, однако мне все еще не хватает исторических данных, я получаю только одну запись за сегодня. Может быть, у вас тоже есть идея?

love 30.08.2024 16:39
Ответ принят как подходящий

Пришлось искать источник, в котором есть все, посмотреть, то ли это вам нужно. Если ответ помог, отметьте его, этот ответ полезен. Евро всегда равен 1. Если вам нужен столбец евро, поместите новый столбец со значением 1. В другом коде вашим источником является ежедневный отчет.

   let

    url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-sdmx.xml",
    Source = Xml.Tables(Web.Contents(url)),
    Table = Source{1}[Table],
    Table1 = Table{0}[Table],
    Table2 = Table1{1}[Table],
    #"Obs Expandido" = Table.ExpandTableColumn(Table2, "Obs", {"Attribute:TIME_PERIOD", "Attribute:OBS_VALUE"}, {"Obs.Attribute:TIME_PERIOD", "Obs.Attribute:OBS_VALUE"}),
    #"Linhas Filtradas" = Table.SelectRows(#"Obs Expandido", each ([#"Attribute:CURRENCY"] = "GBP" or [#"Attribute:CURRENCY"] = "USD")),
    #"Colunas Reordenadas" = Table.ReorderColumns(#"Linhas Filtradas",{"Obs.Attribute:TIME_PERIOD", "Obs.Attribute:OBS_VALUE", "Attribute:CURRENCY", "Attribute:FREQ", "Attribute:CURRENCY_DENOM", "Attribute:EXR_TYPE", "Attribute:EXR_SUFFIX", "Attribute:TIME_FORMAT", "Attribute:COLLECTION"}),
    #"Colunas Removidas" = Table.RemoveColumns(#"Colunas Reordenadas",{"Attribute:FREQ", "Attribute:CURRENCY_DENOM", "Attribute:EXR_TYPE", "Attribute:EXR_SUFFIX", "Attribute:TIME_FORMAT", "Attribute:COLLECTION"}),
    #"Coluna em pivô" = Table.Pivot(#"Colunas Removidas", List.Distinct(#"Colunas Removidas"[#"Attribute:CURRENCY"]), "Attribute:CURRENCY", "Obs.Attribute:OBS_VALUE"),
    #"Linhas Classificadas" = Table.Sort(#"Coluna em pivô",{{"Obs.Attribute:TIME_PERIOD", Order.Descending}})
in
    #"Linhas Classificadas"

или

let

    url = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml",
    Source = Xml.Tables(Web.Contents(url)),
    #"Sender Expandido" = Table.ExpandTableColumn(Source, "Sender", {"name"}, {"Sender.name"}),
    #"http://www.ecb.int/vocabulary/2002-08-01/eurofxref Expandido" = Table.ExpandTableColumn(#"Sender Expandido", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref", {"Cube"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube"}),
    #"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube Expandido" = Table.ExpandTableColumn(#"http://www.ecb.int/vocabulary/2002-08-01/eurofxref Expandido", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube", {"Cube"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube"}),
    #"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube Expandido" = Table.ExpandTableColumn(#"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube Expandido", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube", {"Cube", "Attribute:time"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Attribute:time"}),
    #"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube Expandido" = Table.ExpandTableColumn(#"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube Expandido", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube", {"Attribute:currency", "Attribute:rate"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube.Attribute:curr", "http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube.Attribute:rate"}),
    #"Colunas Removidas" = Table.RemoveColumns(#"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube Expandido",{"subject", "Sender.name"}),
    #"Colunas Renomeadas" = Table.RenameColumns(#"Colunas Removidas",{{"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube.Attribute:curr", "Currency"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Cube.Attribute:rate", "Rate"}, {"http://www.ecb.int/vocabulary/2002-08-01/eurofxref.Cube.Cube.Attribute:time", "Time"}}),
    #"Colunas Reordenadas" = Table.ReorderColumns(#"Colunas Renomeadas",{"Time", "Currency", "Rate"}),
    #"Linhas Filtradas" = Table.SelectRows(#"Colunas Reordenadas", each ([Currency] = "GBP" or [Currency] = "USD")),
    #"Coluna em pivô" = Table.Pivot(#"Linhas Filtradas", List.Distinct(#"Linhas Filtradas"[Currency]), "Currency", "Rate"),
    #"Linhas Classificadas" = Table.Sort(#"Coluna em pivô",{{"Time", Order.Descending}}),
    #"Valor Substituído" = Table.ReplaceValue(#"Linhas Classificadas",".",",",Replacer.ReplaceText,{"USD"}),
    #"Valor Substituído1" = Table.ReplaceValue(#"Valor Substituído",".",",",Replacer.ReplaceText,{"GBP"})
in
    #"Valor Substituído1"

Это прекрасно, большое спасибо за вашу помощь. ecb.europa.eu/stats/eurofxref/eurofxref-hist.xml ecb.europa.eu/stats/eurofxref/eurofxref-sdmx.xml Я даже сам не смог найти эти URL-адреса при попытке. Очень проницательно. Еще раз спасибо.

love 02.09.2024 09:47

Другие вопросы по теме

Похожие вопросы