L'informatique à votre portée
L'informatique prêt-à-porter

Faites appel à moi pour vos formations
sur les dpts 81, 31, 82, 11 et 67 (Strasbourg)
Confiez moi vos développements Office

FacebookTwitterGoogle BookmarksLinkedin

Power Query

Utiliser l'API Meetup

1 mars 2017
Imprimer E-mail

Astuce pour analyser les données d’un groupe Meetup

 Sophie Marchand le 23 janvier a écri un article sur l'analyse d'un groupe Meetup dans Power Bi. Hors elle a soulevé un problème sur la lecture de la totalité des membres d'un groupe Meetup si ce groupe contient plus de 200 membres.

Vous pouvez lire cet article ici : http://www.lecfomasque.com/power-bi-astuce-pour-analyser-les-donnees-dun-groupe-meetup/

Le 13 février je donnais une session sur les fonctions récursives dans Power Query à Montréal durant le Meetup organisé par le Power User Group : Montreal Modern Excel and Power BI.

Je vais donc vous expliquer la solution que je leur ai proposé.

Problème de lecture de plusieurs pages sur une API

Vous trouverez la documentation sur l'API Meetup sur https://www.meetup.com/fr-FR/meetup_api/ Celle-ci nous indique que nous pouvons ajouter 3 informations à nos URL pour l'interrogation de l'API :

  • page : la taille de page (nombre maximal de résultats à chaque réponse)
  • offset : la page à retourner.
    Exemple, page = 10, offset =0 donne les lignes de 1-10, offset=1 de 11à 20, etc..
  • desc : ordre inverse, desc=true

Nous devons donc construire une URL de connexion ainsi :

  • l'URL de base : https://api.meetup.com/members?status=past
  • les paramètres sur le groupe et la clef. Ces 2 derniers sont inscrits dans un paramètres de Power Query
    Power Query Parametres
    Ce qui nous donne l'URL : "https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey
  • Auquel nous ajoutons & "&page=200" & "&offset=0"

Pour les pages suivantes, il nous faut un paramètre qui nous permettra d'indiquer le numéro de page que nous voulons lire : NumPage. Ainsi l'URL complète est la suivante :

“https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey & "&page=200" & "&offset=" & Text.From(NumPage)

J'utilise Text.From pour convertir la donnée numérique en texte.

Pour récupérer la 1ère page nous devons donc :

  1. Construire l'URL
    Power Query - Construction d'une URL
  2. Effectuer un clic-droit sur results et descendre dans la hiérarchie pour récupérer la liste de ce champ.
  3. Convertir la liste en table

Construction de la fonction fnGetMembres

Cette fonction doit effectuer le même processus mais cette fois sur la page NumPage qui lui sera transmis en paramètre.

(NumPage as number)=>
let
    Source = Json.Document(Web.Contents("https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey & "&page=200" & "&offset=" & Text.From(NumPage))),
    results = Source[results],
    ConvertTable = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error)
in
    ConvertTable

Nous devons maintenant combiner le résultat de cette page avec les précédentes. Pour effectuer ceci :

  • il faut ajouter un paramère de type table : MaTable as table
  • Puis effectuer le cumul des tables : CombineTable= Table.Combine({MaTable, ConvertTable}),

Ensuite, nous devons vérifier si le nombre de page est inférieur à 200 et si oui nous somme arrivés à la dernière page. Par contre, dans le cas contraire nous devons passer à la 2e page.

  • NbLignes = Table.RowCount(ConvertTable),
  • Resultat = if NbLignes <200 then CombineTable else fnGetMembres(NumPage + 1, CombineTable)

Le code entier de la fonction est donc le suivant :

(NumPage as number, MaTable as table)=>
let
    Source = Json.Document(Web.Contents("https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey & "&page=200" & "&offset=" & Text.From(NumPage))),
    results = Source[results],
    ConvertTable = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    NbLignes = Table.RowCount(ConvertTable),
    CombineTable= Table.Combine({MaTable, ConvertTable}),
    Resultat = if NbLignes <200 then CombineTable else fnGetMembres(NumPage + 1, CombineTable)
in
    Resultat

Cumuler les pages avec la fonction

Nous avons déjà récupéré la 1ère page, il nous faut donc ajouter une ligne pour lire la 2e et les suivantes

if Table.RowCount(ConvertTable) < 200 then ConvertTable else fnGetMembres(1,ConvertTable)

 Vous avez ainsi le code suivant, qui vous renvoit une table de Record :

let
    Source = Json.Document(Web.Contents("https://api.meetup.com/members?status=past" & "&group_urlname=" & GroupUrlName & "&key=" & MeetupApiKey & "&page=200" & "&offset=0")),
    results = Source[results],
    ConvertTable = Table.FromList(results, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Tous = if Table.RowCount(ConvertTable) < 200 then ConvertTable else fnGetMembres(1,ConvertTable)
in
    Tous

Pour la suite, je vous renvoie sur le très bon article de Sophie.