[EXPERT’TECH] Power BI et API SNCF : une bonne association ?

Comment associer Power BI à l’API SNCF ? Quels en sont les intérêts ?

 

Vous vous demandez peut-être ce qu’est Power BI ? Il s’agit d’un service d’analyse commerciale de Microsoft. Il vous permettra d’établir des rapports et des tableaux de bords grâce à des visuels interactifs simplifiés et de nombreuses fonctionnalités de business intelligence. Cet outil puissant vous permettra donc de visualiser l’évolution de vos KPI’s grâce à des données mises à jour en temps réelle.

 

Power Bi et l’API SNCF, une alliance avantageuse

L’API SNCF (application programming interface) permet d’obtenir toutes les données de transport (départ, destination, numéro, etc.) de n’importe quelle gare en France de façon presque immédiate (20 demandes par minute).

En sachant cela, pourquoi ne pas les combiner et les transformer en un unique et magnifique service, que l’on obtiendra grâce à seulement quelques lignes de code et quelques manipulations de base dans Power BI ? L’idée est de visualiser le numéro de train et sa destination. Cela vous paraît facile, non ? On s’y met !

 

Suivez le mode d’emploi !

Cet article est en partie inspiré d’un excellent tutoriel réalisé par la chaîne Youtube « BharatiDWConsultancy » (voir Power BI Streaming Real Time Dashboards in 10 minutes – DIY -40-of-50). Merci à vous, vous faites un travail exceptionnel !

Créer un tableau de bord en temps réel est donc relativement simple. Si vous suivez les étapes du tutoriel, vous comprendrez comment cela fonctionne. Vous définissez d’abord votre entrée json (champ « Values from stream ») et vous obtenez ainsi votre URL API Power BI. Vous définissez alors cette entrée json dans votre code Python et l’insérez dans Power BI. Enfin, dans le menu dashboard, vous devez créer des visuels pour vos KPI’s. Cependant, la liste de visuels reste très limitée.

D’abord, nous allons sur notre tableau de bord Power BI, nous ajoutons une nouvelle vignette et créons ensuite des données de streaming personnalisées.

Vous créez ensuite les champs que vous voulez mettre à jour en temps réel et sauvegardez l’exemple json quelque part sur votre machine locale (ceci sera nécessaire pour comparer votre sortie python à cet échantillon).

Vous venez à l’instant de créer la structure de données que Power BI stockera dans un cache temporaire, qui expire rapidement. Cela signifie qu’il n’y a pas de base de données sous-jacente, vous ne pourrez donc pas faire de rapport visuel utilisant les données qui affluent depuis le flux des données. Par conséquent, vous ne pourrez pas faire usage de certaines fonctionnalités de rapport telles que le filtrage, les visuels personnalisés et d’autres fonctions d’analyse.

Encore une fois, le tutoriel mentionné ci-dessus explique très bien comment créer simplement un tableau de bord en temps réel, en utilisant des données aléatoires générées par votre script Python. Dans notre cas, nous sommes intéressés par la création d’un service basé sur des données réelles, nous allons donc créer notre compte API SNCF et solliciter l’API depuis notre code Python. Important ! La liste des champs que nous avons créés lorsque nous avons suivi le tutoriel est « headsign », « counter », « departure » (int, int, string).

 

Selon les informations officielles :

L’utilisation de l’API nécessite une clé d’authentification (« token »). Pour obtenir votre clé d’authentification et utiliser l’API SNCF, vous devez préalablement vous inscrire au service grâce au formulaire d’inscription accessible à cette adresse. Cela signifie que nous devons créer un compte et l’équipe SNCF nous enverra la clé par mail. Voyons ce que ça donne !

 

Une fois que vous avez créé votre compte, vous devriez recevoir le message suivant :

Bonjour User,

Merci de vous être inscrit à l’API SNCF. Voici votre clé d’authentification :

<your-token>

Comment vous authentifier à l’API ?

1/ Accédez à l’API

2/ Username : copiez puis collez votre clé

3/ Password : laissez le champ vide ou copiez votre clé directement dans l’URL.

Nous ouvrons donc cette URL dans notre navigateur et collons notre token dans le champ nom d’utilisateur (nous ne mettons rien dans le champ mot de passe).

Essayons pour voir …

Parfait, nous avons maintenant accès à nos données en temps réel ! La seule chose qui nous reste à faire est d’analyser cette sortie json.

Voici le code complet :

import requests

import time

import json

import random

import pandas as pd

 

# Authentication token

api_auth = ‘your-token’

# counter

counter = 0

# Power BI Real Time API

REST_API_URL = ‘https://api.powerbi.com/beta/6494460e-8600-4edc-850f-528e8faad290/datasets/288527d3-eb81-4f17-9df1-dd7270163b86/rows?key=jOtLG%2FGwRo6xcu%2B%2FkyFVn4rU9Z0fbTlNq0CQp2%2FNGB5UtLiG54TJQRauUY26chuRRpOF9d1cJTXwDlmL2MA3Rw%3D%3D’

# next departures from Montparnasse

request_url = ‘https://api.sncf.com/v1/coverage/sncf/stop_areas/stop_area:OCE:SA:87391003/departures?’ \

              ‘datetime=20180912T103450’

# endless loop to call the api every 4 seconds

 

def data_generation(counter=None):

    # call the SNCF Open API

    # auth = (‘username’, ‘password’)

    request_result = requests.get(request_url, auth=(api_auth,  »))

    # json output : context

    context = request_result.json()[‘context’]

    # context sub-node: current date time

    cur_date = context[‘current_datetime’]

    # json_output : departures

    departures = request_result.json()[‘departures’]

    departure = departures[0][‘display_informations’][‘direction’]

    # headsign of the fisrt train

    headsign = int(departures[0][‘display_informations’][‘headsign’])

    return [headsign, counter, departure]

while True:

    data_raw = []

    # simple counter increment

    counter += 1

    for i in range(1):

        row = data_generation(counter)

        data_raw.append(row)

    # set the header record

    HEADER = [« headsign », « counter », « departure »]

    # generate a temp data frame to convert it to json

    data_df = pd.DataFrame(data_raw, columns=HEADER)

    # prepare date for post request (to be sent to Power BI)

    data_json = bytes(data_df.to_json(orient=’records’), encoding=’utf-8′)

    # Post the data on the Power BI API

    req = requests.post(REST_API_URL, data_json)

    print(« Data posted in Power BI API »)

    print(data_json)

    # wait 4 seconds

    time.sleep(4)

 

Nous pouvons maintenant visualiser nos données au sein de notre dashbord Power BI. Cependant, nous ne trouvons toujours pas le moyen de récupérer la destination. Heureusement, Benjamin Crochard, notre expert Power BI, a trouvé un moyen de contourner ce problème :  il vous suffit d’utiliser un histogramme groupé avec la destination en tant que légende et le compteur comme valeur de barre. Même s’il ne s’agit pas de la solution « réelle », cela permet de contourner cet obstacle définitivement.

C’est désormais à vous d’adapter ces deux solutions à vos besoins et d’une certaine façon, rendre notre quotidien un peu meilleur.

A vous de jouer !

 

Traduit de l’anglais, consultez la version originale ainsi que les références utilisées dans cet article ici.

Ecrit par Alibek Jakupov.

Contactez-nous
Construisons le futur ensemble

80 bis avenue du Général Leclerc
78220 Viroflay

+33(1) 39 24 22 70

info@expertime.fr

10 rue Édouard Nignon
44372 Nantes

+33(2) 40 50 28 02

info@expertime.fr

4 place Amédée Bonnet
69002 Lyon

+33(1) 39 24 22 70

info@expertime.fr