Power Query

Utiliser l'API Meetup

1 mars 2017
Imprimer

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

 Sophie Marchand le 23 janvier a écrit 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 :

Nous devons donc construire une URL de connexion ainsi :

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 :

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.

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.