Appels API & Dataflow

Étiquetté : ,

  • Appels API & Dataflow

    Posté par Raph0707 sur 31 mai 2022 à 17h48

    Pour ma 1ere APPS Je viens de me lancer dans la refonte avec la Power Platform d’une “appli” que j’avais créé il y a 20 ans mais arrêté de maintenir au bout de quelques années.

    La première étape consiste à interroger des API qui me renvoient des résultats au format Json pour les stocker dans des tables Dataverse (j’ai pour le moment créé 4 tables mais n’en rempli qu’une)

    Après recherche j’ai pour le moment trouvé 2 sociétés américaines répondant à mes besoins qui proposent de fournir des API Key gratuites pour utiliser leurs API mais avec des limitations.

    – les API de la société 1 sont parfaites mais ne me permettent de faire que 100 call / mois donc je vais les limiter à qq usages
    Via un Dataflow et mapping j’arrive à alimenter la table Dataverse qui m’intéresse mais j’ai trop vite atteint le seuil de 100 requêtes / mois.

    – les API de la société 2 (https://www.alphavantage.co/) permettent de faire 500 call / jour (avec limitation de 5 call / min) mais me posent quelques problèmes et sont plus limitatives.

    Voici le problème que j’ai avec:

    J’ai créé un Dataflow > API Web en indiquant en URL l’endpoint de l’API le plus adapté.

    Il est du style:
    https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AI.PAR&outputsize=full&apikey=myAPIKey

    où myAPIKey correspond à l’API Key que m’a fourni la société et symbol=AI.PAR correspond à la société dont je veux récupérer le cours en Bourse. (AI: code de la société / PAR : marché Euronext Paris)

    Ma difficulté est que le Json renvoyé renvoie le cours en Bourse du Jour mais également l’ensemble des cours des jours précédents (pas moyen de faire autrement):

    ex:
    {
    “Meta Data”: {
    “1. Information”: “Daily Prices (open, high, low, close) and Volumes”,
    “2. Symbol”: “AI.PAR”,
    “3. Last Refreshed”: “2022-05-26”,
    “4. Output Size”: “Full size”,
    “5. Time Zone”: “US/Eastern”
    },

    “Time Series (Daily)”: {
    “2022-05-26”: {
    “1. open”: “161.2400”,
    “2. high”: “162.1000”,
    “3. low”: “160.3000”,
    “4. close”: “162.1000”,
    “5. volume”: “527695”
    },

    “2022-05-25”: {
    “1. open”: “161.8400”,
    “2. high”: “162.3400”,
    “3. low”: “160.7600”,
    “4. close”: “161.0600”,
    “5. volume”: “527665”
    },
    ….
    etc ….

    Comment puis je faire en sorte que la mapping du Dataflow ne s’applique que sur les premières “données” du Json c’est à dire celle du jour donc dans le cas présent avec un appel API le 26/05 soir c’est à dire les données du 2022-05-26 :

    Peut être qu’une solution est de parser le json mais comment ?

    PostID=VC1AS92wIFHNWYr

    DavidZed a répondu Il y a 7 mois, 3 semaines 1 Membre · 6 Réponses
  • 6 Réponses
  • DavidZed

    Membre
    1 juin 2022 à 9h02

    Bonjour,

    Tu peux déjà remplacer dans ton url le outputsize= full par compact pour limiter aux 100 derniers jours (en full tu remontes jusqu’à 20 ans de data)
    https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AI.PAR&outputsize=compact&apikey=myAPIKey

    CommentID=KlN8e7qRlhjSrgq, PostID=VC1AS92wIFHNWYr

  • Raph0707

    Membre
    1 juin 2022 à 10h38

    Merci ! en fait j’avais déjà fait cette modification dans un test ultérieur mais ca renvoie tout de même trop de résultats. Donc nécessité de trouver comment parser cela ou autre.

    CommentID=7LlxTxCZFPwZTNu, PostID=VC1AS92wIFHNWYr

  • DavidZed

    Membre
    1 juin 2022 à 13h21

    Je ne saurais pas filtrer directement via l’API, par contre dans ton dataflow, dans power query, tu peux essayer ceci dans l’éditeur avancé :

    letn    Source = Json.Document(Web.Contents("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AI.PAR&outputsize=compact&apikey=myAPIKey")),n    #"Converti en table" = Record.ToTable(Source),n    Value = #"Converti en table"{1}[Value],n    #"Converti en table1" = Record.ToTable(Value),n    #"Conserver les premières lignes" = Table.FirstN(#"Converti en table1",1),n    Value1 = #"Conserver les premières lignes"{0}[Value]ninn    Value1

    CommentID=E5LDAZ4Xm24zwba, PostID=VC1AS92wIFHNWYr

  • Raph0707

    Membre
    1 juin 2022 à 15h38

    ok top merci pour l’aide ! je testerai cela ce soir ou ce week end

    CommentID=Zb6lCKBOiNS158q, PostID=VC1AS92wIFHNWYr

  • Raph0707

    Membre
    1 juin 2022 à 21h17

    Merci ca me renvoie bien uniquement les données du jour

    Par contre j’ai un problème pour le mapping que je n’avais pas avec l’autre API.

    Je souhaiterai mapper dans une colonne d’un table uniquement le champ souligné en rouge

    et dans 2 autres colonnes de ma table Dataverse 2 valeurs présentes dans les Meta Data du Json (la valeur de 2.Symbol et la valeur de 3. Last Refreshed)

    Meta Data”: {
    “1. Information”: “Daily Prices (open, high, low, close) and Volumes”,
    “2. Symbol”: “AI.PAR”,
    “3. Last Refreshed”: “2022-05-26”,
    “4. Output Size”: “Full size”,
    “5. Time Zone”: “US/Eastern”
    },

    Je cherche mais pour le moment je n’ai pas trouvé comment faire.

    CommentID=w26ZcO1HTIsX1Wi, PostID=VC1AS92wIFHNWYr

  • DavidZed

    Membre
    2 juin 2022 à 0h31

    J’y arrive en faisant deux requêtes :

    Requête1

    letn    Source = Json.Document(Web.Contents("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AI.PAR&outputsize=compact&apikey=myAPIKey")),n    #"Meta Data" = Source[Meta Data],n    #"Converti en table" = Record.ToTable(#"Meta Data"),n    #"Plage de lignes conservée" = Table.Range(#"Converti en table",1,2),n    #"Requête ajoutée" = Table.Combine({#"Plage de lignes conservée", Requête2}),n    #"Table transposée" = Table.Transpose(#"Requête ajoutée"),n    #"En-têtes promus" = Table.PromoteHeaders(#"Table transposée", [PromoteAllScalars=true]),n    #"Type modifié" = Table.TransformColumnTypes(#"En-têtes promus",{{"2. Symbol", type text}, {"3. Last Refreshed", type date}, {"4. close", type text}})ninn    #"Type modifié"

    Requête2

    letn    Source = Json.Document(Web.Contents("https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=AI.PAR&outputsize=compact&apikey=myAPIKey")),n    #"Converti en table" = Record.ToTable(Source),n    Value = #"Converti en table"{1}[Value],n    #"Converti en table1" = Record.ToTable(Value),n    #"Conserver les premières lignes" = Table.FirstN(#"Converti en table1",1),n    Value1 = #"Conserver les premières lignes"{0}[Value],n    #"Converti en table2" = Record.ToTable(Value1),n    #"Plage de lignes conservée" = Table.Range(#"Converti en table2",3,1)ninn    #"Plage de lignes conservée"

    La requête 2 est ajoutée à la 1

    Quelqu’un qui a plus l’habitude de power Query trouvera peut-être plus simple 🙂

    CommentID=fGTIaRjQOlCP4c7, PostID=VC1AS92wIFHNWYr

Connectez-vous pour répondre.