cancel
Showing results for 
Search instead for 
Did you mean: 
Reply
danielntamasi
Frequent Visitor

Change parameter back and forth between 2-3 values for a sequence of query requests in Power Query

Hi,

 

I'm running a couple of API requests that pulls all the stock information from a list for hundreds of stocks. Unfortunately, I'm running into a couple of issues:

  • Because my the API provider only allows 5 calls per minute, I need to use the InvokeAfter feature to delay my call.
  • However due to the number of calls I'm making, my query load time exceeds the 120 minutes on the Power BI service.

I'm trying to cut down on the time by using multiple API keys to pull the data faster. Unfortunately, I don't know how to parameterize the pull of API keys dynamically in a Power Query script to switch between 2-3 different keys after each call.

 

 

Meaning:

  1. First stock is pulled with APIkey_1
  2. Second stock is pulled with APIkey_2
  3. Third stock is pulled with APIkey_3
  4. Forth stock is pulled with APIkey_1 (as i reuse just 2-3 keys without exceeding the allotted 5 calls per API key per minute).
  5. Fitfh stock is pulled with APIkey_2 (as i reuse just 2-3 keys without exceeding the allotted 5 calls per API key per minute).
  6. Sixth stock is pulled with APIkey_3 (as i reuse just 2-3 keys without exceeding the allotted 5 calls per API key per minute).
  7. ... and so on.

FYI, here is my query below, relevant pieces are highlighted with red and blue. Also, my query runs fine other than the issue mentioned above.

 

Thank you for your answer in advance!

 

Best,

DT

 

let
    Source = Json.Document(Web.Contents("https://data.opendatasoft.com/api/records/1.0/search/?dataset=cusip-isin-sp-500-nasdaq-100%40public-us&rows=600")),
    records = Source[records],
    #"Converted to Table" = Table.FromList(records, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"datasetid", "recordid", "fields", "record_timestamp"}, {"datasetid", "recordid", "fields", "record_timestamp"}),
    #"Expanded fields" = Table.ExpandRecordColumn(#"Expanded Column1", "fields", {"cusip_number", "ticker", "company_name", "isin_code"}, {"cusip_number", "ticker", "company_name", "isin_code"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded fields",{"datasetid", "recordid", "cusip_number", "isin_code", "record_timestamp"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "Custom", each Function.InvokeAfter(()=>Json.Document(Web.Contents("https://www.alphavantage.co/",
    [RelativePath="query?function=TIME_SERIES_DAILY_ADJUSTED&outputsize=full&apikey=" & APIkey_1 & "&symbol=" & [ticker]])), #duration(0,0,0,6))),
    //I would like to dynamically change the "APIkey_1" above to "APIkey_2", then "APIkey_3", then back to "APIkey_1", then "APIkey_2", then "APIkey_3", and so on.
    #"Expanded Custom" = Table.ExpandRecordColumn(#"Added Custom", "Custom", {"Time Series (Daily)"}, {"TimeSeries"}),
    #"Expanded TimeSeries" = Table.ExpandRecordColumn(#"Expanded Custom", "TimeSeries", Table.ColumnNames(Table.FromRecords(#"Expanded Custom"[TimeSeries]))),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Expanded TimeSeries", {"ticker", "company_name"}, "Attribute", "Value"),
    #"Expanded Value" = Table.ExpandRecordColumn(#"Unpivoted Columns", "Value", {"5. adjusted close", "7. dividend amount"}, {"Value.5. adjusted close", "Value.7. dividend amount"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded Value",{{"Attribute", "Date"}, {"Value.5. adjusted close", "Adjusted close"}, {"Value.7. dividend amount", "Dividend"}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"Adjusted close", type number}, {"Dividend", type number}}),
    #"Extracted Last Characters" = Table.TransformColumns(#"Changed Type1", {{"Date", each Text.End(_, 10), type text}}),
    #"Parsed Date" = Table.TransformColumns(#"Extracted Last Characters",{{"Date", each Date.From(DateTimeZone.From(_)), type date}}),
    #"Filtered Rows" = Table.SelectRows(#"Parsed Date", each true),
    #"Renamed Columns1" = Table.RenameColumns(#"Filtered Rows",{{"company_name", "Company name"}, {"ticker", "Ticker"}})
in
    #"Renamed Columns1"
3 REPLIES 3
dax
Community Support
Community Support

Hi danielntamasi,

I saw you seems use parameter in your query  apikey=" & APIkey_1 & "&symbol=" & [ticker]. You could try to use query like below

let dynamic1= (api) =>
let
    Source = Json.Document(Web.Contents("https://data.opendatasoft.com/api/records/1.0/search/?dataset=cusip-isin-sp-500-nasdaq-100%40public-us&rows=600")),
    records = Source[records],
    #"Converted to Table" = Table.FromList(records, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    #"Expanded Column1" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"datasetid", "recordid", "fields", "record_timestamp"}, {"datasetid", "recordid", "fields", "record_timestamp"}),
    #"Expanded fields" = Table.ExpandRecordColumn(#"Expanded Column1", "fields", {"cusip_number", "ticker", "company_name", "isin_code"}, {"cusip_number", "ticker", "company_name", "isin_code"}),
    #"Removed Columns" = Table.RemoveColumns(#"Expanded fields",{"datasetid", "recordid", "cusip_number", "isin_code", "record_timestamp"}),
    #"Added Custom" = Table.AddColumn(#"Removed Columns", "Custom", each Function.InvokeAfter(()=>Json.Document(Web.Contents("https://www.alphavantage.co/",
    [RelativePath="query?function=TIME_SERIES_DAILY_ADJUSTED&outputsize=full&apikey=api&symbol=" & [ticker]])), #duration(0,0,0,6))),
    //I would like to dynamically change the "APIkey_1" above to "APIkey_2", then "APIkey_3", then back to "APIkey_1", then "APIkey_2", then "APIkey_3", and so on.
    #"Expanded Custom" = Table.ExpandRecordColumn(#"Added Custom", "Custom", {"Time Series (Daily)"}, {"TimeSeries"}),
    #"Expanded TimeSeries" = Table.ExpandRecordColumn(#"Expanded Custom", "TimeSeries", Table.ColumnNames(Table.FromRecords(#"Expanded Custom"[TimeSeries]))),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Expanded TimeSeries", {"ticker", "company_name"}, "Attribute", "Value"),
    #"Expanded Value" = Table.ExpandRecordColumn(#"Unpivoted Columns", "Value", {"5. adjusted close", "7. dividend amount"}, {"Value.5. adjusted close", "Value.7. dividend amount"}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded Value",{{"Attribute", "Date"}, {"Value.5. adjusted close", "Adjusted close"}, {"Value.7. dividend amount", "Dividend"}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"Adjusted close", type number}, {"Dividend", type number}}),
    #"Extracted Last Characters" = Table.TransformColumns(#"Changed Type1", {{"Date", each Text.End(_, 10), type text}}),
    #"Parsed Date" = Table.TransformColumns(#"Extracted Last Characters",{{"Date", each Date.From(DateTimeZone.From(_)), type date}}),
    #"Filtered Rows" = Table.SelectRows(#"Parsed Date", each true),
    #"Renamed Columns1" = Table.RenameColumns(#"Filtered Rows",{{"company_name", "Company name"}, {"ticker", "Ticker"}})
in
    #"Renamed Columns1"
in
    dynamic1

Then you could manage parameter api to use different api key.

Best Regards,
Zoe Zhi

If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

 

Zoe,

Thank you for your answer. Unfortunately, I need to change the between the API keys, whilst still running the same query. In other words: I run the query for ~600 stocks. I need the API keys to change between 2-3 values in a loop while going through the ~600 stock.

Something like this:
1st stock: 1st key
2nd stock: 2nd key
3rd stock: 3rd key
4th stock: 1st key
5th stock: 2nd key
6th stock: 3rd key...
...
598th stock: 1st key
599th stock: 2nd key
600th stock: 3rd key

@dax, any suggestions for this?

Helpful resources

Announcements
August 1 episode 9_no_dates 768x460.jpg

The Power BI Community Show

Watch the playback when Priya Sathy and Charles Webb discuss Datamarts! Kelly also shares Power BI Community updates.

Power BI Dev Camp Session 24 without aka link and time 768x460.jpg

Ted's Dev Camp - July 28, 2022

Watch Session 24 of Ted's Dev Camp along with past sessions!

Power Platform Conf 2022 768x460.jpg

Join us for Microsoft Power Platform Conference

The first Microsoft-sponsored Power Platform Conference is coming in September. 100+ speakers, 150+ sessions, and what's new and next for Power Platform.