{"cells": [{"cell_type": "markdown", "metadata": {}, "source": ["# 2A.eco - Exercice API SNCF\n", "\n", "Manipulation d'une [API REST](https://fr.wikipedia.org/wiki/Representational_state_transfer), celle de la SNCF est prise comme exemple. Exercices."]}, {"cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [{"data": {"text/html": ["
run previous cell, wait for 2 seconds
\n", ""], "text/plain": [""]}, "execution_count": 2, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import add_notebook_menu\n", "add_notebook_menu()"]}, {"cell_type": "markdown", "metadata": {}, "source": ["API signifie Application Programming Interface. Le mot le plus important est \u201cinterface\u201d, et c\u2019est le mot le plus simple, car nous utilisons tous des interfaces au quotidien. Par exemple une t\u00e9l\u00e9commande de la TV. Vous avez un groupe de boutons et interrupteurs qui vous permettent de faire diff\u00e9rentes op\u00e9rations. Vous savez quel bouton correspond \u00e0 quelle action. Par exemple, vous ne pouvez pas allumer votre TV avec le bouton de volume. Pour que cela marche, vous devez respecter l'interface et interagir avec elle de la fa\u00e7on qui a \u00e9t\u00e9 pr\u00e9vue lors de sa conception.\n", "\n", "Une API est une interface pour les applications. Une API vient presque toujours avec une documentation. La documentation du code est un texte \u00e9crit par les d\u00e9veloppeurs qui rend plus facile l\u2019utilisation du code de cette API. Elle explique comment le code fonctionne, pourquoi il a \u00e9t\u00e9 \u00e9crit d\u2019une certaine fa\u00e7on et pas d\u2019une autre, comment contribuer au projet, et bien plus encore. Lire la documentation est essentiel pour bien int\u00e9grer l\u2019API d\u2019une autre plateforme. Et chaque API a sa propre logique de fonctionnement. \n", "\n", "Ici, vous allez d\u00e9couvrir l'API de la SNCF qui donne acc\u00e8s \u00e0 de nombreuses informations li\u00e9es \u00e0 la mobilit\u00e9."]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ici, comme souvent, il s'agit d'une API [REST](Comment fonctionne une API sans Python ? Ici, on a une api classique). REST signifie \u201cRepresentational State Transfer\u201d. Les API REST sont bas\u00e9es sur HTTP, qui signifie Hypertext Transfer Protocol. C\u2019est le protocole au coeur du web. Il d\u00e9finit la communication entre les diff\u00e9rentes parties du web. L\u2019\u00e9change est bas\u00e9 sur des requ\u00eates client et serveur. Le principe du client-serveur d\u00e9finit les deux entit\u00e9s qui interagissent dans une API REST : un client et un serveur, les m\u00eames entit\u00e9s qui communiquent sur le web. Un client envoie une requ\u00eate, et le serveur renvoie une r\u00e9ponse. \n", "\n", "Les r\u00e9ponses du serveur pour les API REST peuvent \u00eatre d\u00e9livr\u00e9es dans de multiples formats. JSON (JavaScript Object Notation) est souvent utilis\u00e9, mais XML, CSV, ou m\u00eame RSS sont aussi valables. Ici (comme souvent), il s'agit d'un format JSON."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Partie 0 - modules recommand\u00e9s et connexion \u00e0 l'API \n", "\n", "Il vous faudra s\u00fbrement les modules suivant : \n", "\n", "- [requests](http://docs.python-requests.org/en/master/)\n", "- [datetime](https://docs.python.org/3/library/datetime.html)\n", "- [pandas](http://pandas.pydata.org/)\n", "- [matplotlib](http://matplotlib.org/)\n", "\n", "Cr\u00e9er un login pour vous connecter \u00e0 l'API de la SNCF https://data.sncf.com/api.\n", "\n", "Il est possible de stocker une cl\u00e9 de fa\u00e7on cach\u00e9e sur votre ordinateur avec le module [keyring](http://pythonhosted.org/keyring/)."]}, {"cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": ["import os\n", "from pyquickhelper.loghelper import get_password\n", "key = get_password(\"sncf\", \"ensae_teaching_cs,key\")"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Requ\u00eater une API sans Python "]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pour faire une requ\u1ebft\u00e9 via l'API SNCF, il \"suffit\" de passer les bons param\u00e8tres dans l'url, au format indiqu\u00e9 par la documentation. Comme souvent, c'est un syst\u00e8me cl\u00e9/valeur : url?key1=value1&key2=value2. \n", "\n", "Pour savoir quelles cl\u00e9s et quelles valeurs indiquer : il faut lire la [Documentation](http://doc.navitia.io/) (la SNCF n'a pas fait sa propre documentation, mais il suffit de remplacer navitia.io par sncf.com dans les exemples donn\u00e9s).\n", "\n", "En r\u00e9ponse \u00e0 la requ\u00eate, le serveur renvoie un document JSON (JavaScript Object Notation). Cela ressemble \u00e0 un dictionnaire Python.\n", "\n", "Exemple, aller \u00e0 : https://api.sncf.com/v1/coverage/sncf/stop_areas (si cela ne fonctionne pas, indiquez votre token de la mani\u00e8re suivante : https://{token}@api.sncf.com/v1/coverage/sncf/stop_areas. Exemple : [stop_areas.json](https://raw.githubusercontent.com/sdpython/ensae_teaching_cs/master/_doc/notebooks/td2a_eco/stop_areas.json).\n", "\n", "Enregistrez le r\u00e9sultat dans un fichier texte (au m\u00eame endroit o\u00f9 vous avez ouvert votre notebook tant qu'\u00e0 faire), et ajoutez l'extension .json"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Manipuler un fichier json en Python "]}, {"cell_type": "markdown", "metadata": {}, "source": ["Nous exliquons ci-dessous comment importer et exporter un fichier json en Python."]}, {"cell_type": "code", "execution_count": 3, "metadata": {"scrolled": false}, "outputs": [{"data": {"text/plain": ["{'disruptions': [],\n", " 'pagination': {'start_page': 0,\n", " 'items_on_page': 25,\n", " 'items_per_page': 25,\n", " 'total_result': 3029},\n", " 'stop_areas': [{'codes': [{'type': 'CR-CI-CH', 'value': '0080-253914-BV'}],\n", " 'name': 'Saarbrucken-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.24065', 'lon': '6.990968'},\n", " 'label': 'Saarbrucken-Hbf (Saarbr\u00fccken)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Saarbr\u00fccken',\n", " 'level': 8,\n", " 'coord': {'lat': '49.23436', 'lon': '6.996379'},\n", " 'label': 'Saarbr\u00fccken',\n", " 'id': 'admin:1187159extern',\n", " 'zip_code': ''},\n", " {'insee': '',\n", " 'name': 'Mitte',\n", " 'level': 9,\n", " 'coord': {'lat': '49.251404', 'lon': '6.99026'},\n", " 'label': 'Mitte',\n", " 'id': 'admin:5432693extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80253914'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-110684-00'}],\n", " 'name': 'Frankfurt-am-Main-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '50.107216', 'lon': '8.66405'},\n", " 'label': 'Frankfurt-am-Main-Hbf',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Gallus',\n", " 'level': 9,\n", " 'coord': {'lat': '50.103378', 'lon': '8.636285'},\n", " 'label': 'Gallus',\n", " 'id': 'admin:4209936extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80110684'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-140087-BV'}],\n", " 'name': 'Mannheim-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.479714', 'lon': '8.470079'},\n", " 'label': 'Mannheim-Hbf',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Schwetzingerstadt/Oststadt',\n", " 'level': 9,\n", " 'coord': {'lat': '49.48053', 'lon': '8.488332'},\n", " 'label': 'Schwetzingerstadt/Oststadt',\n", " 'id': 'admin:3286571extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80140087'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142281-BV'}],\n", " 'name': 'Karlsruhe-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '48.99439', 'lon': '8.400254'},\n", " 'label': 'Karlsruhe-Hbf',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142281'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142778-BV'}],\n", " 'name': 'Baden-Baden',\n", " 'links': [],\n", " 'coord': {'lat': '48.790281', 'lon': '8.191165'},\n", " 'label': 'Baden-Baden',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142778'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142893-BV'}],\n", " 'name': 'Appenweier',\n", " 'links': [],\n", " 'coord': {'lat': '48.541326', 'lon': '7.973672'},\n", " 'label': 'Appenweier (Appenweier)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Appenweier',\n", " 'level': 8,\n", " 'coord': {'lat': '48.553204', 'lon': '7.97982'},\n", " 'label': 'Appenweier',\n", " 'id': 'admin:452982extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142893'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142901-00'}],\n", " 'name': 'Legelshurst',\n", " 'links': [],\n", " 'coord': {'lat': '48.558571', 'lon': '7.913724'},\n", " 'label': 'Legelshurst (Willst\u00e4tt)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Willst\u00e4tt',\n", " 'level': 8,\n", " 'coord': {'lat': '48.550797', 'lon': '7.894595'},\n", " 'label': 'Willst\u00e4tt',\n", " 'id': 'admin:452980extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142901'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142919-00'}],\n", " 'name': 'Kork',\n", " 'links': [],\n", " 'coord': {'lat': '48.570017', 'lon': '7.874009'},\n", " 'label': 'Kork (Kehl)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Kehl',\n", " 'level': 8,\n", " 'coord': {'lat': '48.573151', 'lon': '7.811103'},\n", " 'label': 'Kehl',\n", " 'id': 'admin:452979extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142919'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-021402-BV'}],\n", " 'name': 'Augsburg-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '48.365581', 'lon': '10.886756'},\n", " 'label': 'Augsburg-Hbf',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80021402'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0071-793158-BV'}],\n", " 'name': 'Port-Bou',\n", " 'links': [],\n", " 'coord': {'lat': '42.424467', 'lon': '3.15786'},\n", " 'label': 'Port-Bou (Portbou)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Portbou',\n", " 'level': 8,\n", " 'coord': {'lat': '42.427444', 'lon': '3.158865'},\n", " 'label': 'Portbou',\n", " 'id': 'admin:345217extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:71793150'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0087-677914-WE'}],\n", " 'name': 'Irun',\n", " 'links': [],\n", " 'coord': {'lat': '43.339432', 'lon': '-1.801337'},\n", " 'label': 'Irun (Irun)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Irun',\n", " 'level': 8,\n", " 'coord': {'lat': '43.338318', 'lon': '-1.788809'},\n", " 'label': 'Irun',\n", " 'id': 'admin:346782extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:71116000'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251819-BV'}],\n", " 'name': 'Trier-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.756761', 'lon': '6.652361'},\n", " 'label': 'Trier-Hbf',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80251819'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251850-BV'}],\n", " 'name': 'Konz-Mitte',\n", " 'links': [],\n", " 'coord': {'lat': '0.0', 'lon': '0.0'},\n", " 'label': 'Konz-Mitte',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80251850'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251967-BV'}],\n", " 'name': 'Perl',\n", " 'links': [],\n", " 'coord': {'lat': '0.0', 'lon': '0.0'},\n", " 'label': 'Perl',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80251967'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0087-113209-BV'}],\n", " 'name': 'Pantin',\n", " 'links': [],\n", " 'coord': {'lat': '48.897776', 'lon': '2.400426'},\n", " 'label': 'Pantin (Pantin)',\n", " 'administrative_regions': [{'insee': '93055',\n", " 'name': 'Pantin',\n", " 'level': 8,\n", " 'coord': {'lat': '48.896503', 'lon': '2.40198'},\n", " 'label': 'Pantin (93500)',\n", " 'id': 'admin:67685extern',\n", " 'zip_code': '93500'}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:87113209'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-290346-BV'}],\n", " 'name': 'Stuttgart',\n", " 'links': [],\n", " 'coord': {'lat': '48.783622', 'lon': '9.180496'},\n", " 'label': 'Stuttgart',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Stuttgart-Mitte',\n", " 'level': 9,\n", " 'coord': {'lat': '48.77924', 'lon': '9.181115'},\n", " 'label': 'Stuttgart-Mitte',\n", " 'id': 'admin:1107850extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80290346'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194035-BV'}],\n", " 'name': 'Neustadt (Weinstr) Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.350034', 'lon': '8.140647'},\n", " 'label': 'Neustadt (Weinstr) Hbf',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Neustadt-Stadtmitte',\n", " 'level': 9,\n", " 'coord': {'lat': '49.352497', 'lon': '8.117826'},\n", " 'label': 'Neustadt-Stadtmitte',\n", " 'id': 'admin:456995extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80194035'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194258-BV'}],\n", " 'name': 'Landau Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.1976', 'lon': '8.12557'},\n", " 'label': 'Landau Hbf',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80194258'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0083-002451-00'}],\n", " 'name': 'Vercelli',\n", " 'links': [],\n", " 'coord': {'lat': '45.329112', 'lon': '8.414824'},\n", " 'label': 'Vercelli (Vercelli)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Vercelli',\n", " 'level': 8,\n", " 'coord': {'lat': '45.325153', 'lon': '8.422766'},\n", " 'label': 'Vercelli (13100)',\n", " 'id': 'admin:1552703extern',\n", " 'zip_code': '13100'}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:83002451'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194324-BV'}],\n", " 'name': 'WINDEN PFALZ',\n", " 'links': [],\n", " 'coord': {'lat': '49.095415', 'lon': '8.122376'},\n", " 'label': 'WINDEN PFALZ (Winden)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Winden',\n", " 'level': 8,\n", " 'coord': {'lat': '49.094616', 'lon': '8.11692'},\n", " 'label': 'Winden',\n", " 'id': 'admin:1250497extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80194324'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-196980-BV'}],\n", " 'name': 'Kaiserslautern-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '49.43628', 'lon': '7.768563'},\n", " 'label': 'Kaiserslautern-Hbf',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80196980'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-203471-00'}],\n", " 'name': 'Munchen-Hbf',\n", " 'links': [],\n", " 'coord': {'lat': '48.140325', 'lon': '11.560415'},\n", " 'label': 'Munchen-Hbf',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Stadtbezirk 02 Ludwigsvorstadt-Isarvorstadt',\n", " 'level': 9,\n", " 'coord': {'lat': '48.13073', 'lon': '11.561022'},\n", " 'label': 'Stadtbezirk 02 Ludwigsvorstadt-Isarvorstadt',\n", " 'id': 'admin:54392extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80203471'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0087-212910-WD'}],\n", " 'name': 'Kehl',\n", " 'links': [],\n", " 'coord': {'lat': '48.576486', 'lon': '7.808005'},\n", " 'label': 'Kehl (Kehl)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Kehl',\n", " 'level': 8,\n", " 'coord': {'lat': '48.573151', 'lon': '7.811103'},\n", " 'label': 'Kehl',\n", " 'id': 'admin:452979extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80142927'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143099-BV'}],\n", " 'name': 'Offenburg',\n", " 'links': [],\n", " 'coord': {'lat': '48.476447', 'lon': '7.946696'},\n", " 'label': 'Offenburg (Offenburg)',\n", " 'administrative_regions': [{'insee': '',\n", " 'name': 'Offenburg',\n", " 'level': 8,\n", " 'coord': {'lat': '48.471657', 'lon': '7.944377'},\n", " 'label': 'Offenburg',\n", " 'id': 'admin:452988extern',\n", " 'zip_code': ''}],\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80143099'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143503-BV'}],\n", " 'name': 'Freiburg-Breisgau',\n", " 'links': [],\n", " 'coord': {'lat': '47.997776', 'lon': '7.841564'},\n", " 'label': 'Freiburg-Breisgau',\n", " 'timezone': 'Europe/Paris',\n", " 'id': 'stop_area:OCE:SA:80143503'}],\n", " 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',\n", " 'type': 'stop_areas',\n", " 'rel': 'stop_areas',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',\n", " 'type': 'route_schedules',\n", " 'rel': 'route_schedules',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',\n", " 'type': 'stop_schedules',\n", " 'rel': 'stop_schedules',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',\n", " 'type': 'arrivals',\n", " 'rel': 'arrivals',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',\n", " 'type': 'departures',\n", " 'rel': 'departures',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',\n", " 'type': 'places_nearby',\n", " 'rel': 'places_nearby',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',\n", " 'type': 'journey',\n", " 'rel': 'journeys',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',\n", " 'type': 'disruption',\n", " 'rel': 'disruptions',\n", " 'templated': True},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',\n", " 'type': 'next',\n", " 'templated': False},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=121.12',\n", " 'type': 'last',\n", " 'templated': False},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',\n", " 'type': 'first',\n", " 'templated': False}]}"]}, "execution_count": 4, "metadata": {}, "output_type": "execute_result"}], "source": ["import json\n", "\n", "with open('stop_areas.json','r') as f:\n", " data=json.load(f)\n", "data"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Ce n'est pas tr\u00e8s lisible. Utilisez le module pretty print."]}, {"cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["{'disruptions': [],\n", " 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',\n", " 'rel': 'stop_areas',\n", " 'templated': True,\n", " 'type': 'stop_areas'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',\n", " 'rel': 'route_schedules',\n", " 'templated': True,\n", " 'type': 'route_schedules'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',\n", " 'rel': 'stop_schedules',\n", " 'templated': True,\n", " 'type': 'stop_schedules'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',\n", " 'rel': 'arrivals',\n", " 'templated': True,\n", " 'type': 'arrivals'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',\n", " 'rel': 'departures',\n", " 'templated': True,\n", " 'type': 'departures'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',\n", " 'rel': 'places_nearby',\n", " 'templated': True,\n", " 'type': 'places_nearby'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',\n", " 'rel': 'journeys',\n", " 'templated': True,\n", " 'type': 'journey'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',\n", " 'rel': 'disruptions',\n", " 'templated': True,\n", " 'type': 'disruption'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',\n", " 'templated': False,\n", " 'type': 'next'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=121.12',\n", " 'templated': False,\n", " 'type': 'last'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',\n", " 'templated': False,\n", " 'type': 'first'}],\n", " 'pagination': {'items_on_page': 25,\n", " 'items_per_page': 25,\n", " 'start_page': 0,\n", " 'total_result': 3029},\n", " 'stop_areas': [{'administrative_regions': [{'coord': {'lat': '49.23436',\n", " 'lon': '6.996379'},\n", " 'id': 'admin:1187159extern',\n", " 'insee': '',\n", " 'label': 'Saarbr\u00fccken',\n", " 'level': 8,\n", " 'name': 'Saarbr\u00fccken',\n", " 'zip_code': ''},\n", " {'coord': {'lat': '49.251404',\n", " 'lon': '6.99026'},\n", " 'id': 'admin:5432693extern',\n", " 'insee': '',\n", " 'label': 'Mitte',\n", " 'level': 9,\n", " 'name': 'Mitte',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-253914-BV'}],\n", " 'coord': {'lat': '49.24065', 'lon': '6.990968'},\n", " 'id': 'stop_area:OCE:SA:80253914',\n", " 'label': 'Saarbrucken-Hbf (Saarbr\u00fccken)',\n", " 'links': [],\n", " 'name': 'Saarbrucken-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '50.103378',\n", " 'lon': '8.636285'},\n", " 'id': 'admin:4209936extern',\n", " 'insee': '',\n", " 'label': 'Gallus',\n", " 'level': 9,\n", " 'name': 'Gallus',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-110684-00'}],\n", " 'coord': {'lat': '50.107216', 'lon': '8.66405'},\n", " 'id': 'stop_area:OCE:SA:80110684',\n", " 'label': 'Frankfurt-am-Main-Hbf',\n", " 'links': [],\n", " 'name': 'Frankfurt-am-Main-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.48053',\n", " 'lon': '8.488332'},\n", " 'id': 'admin:3286571extern',\n", " 'insee': '',\n", " 'label': 'Schwetzingerstadt/Oststadt',\n", " 'level': 9,\n", " 'name': 'Schwetzingerstadt/Oststadt',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-140087-BV'}],\n", " 'coord': {'lat': '49.479714', 'lon': '8.470079'},\n", " 'id': 'stop_area:OCE:SA:80140087',\n", " 'label': 'Mannheim-Hbf',\n", " 'links': [],\n", " 'name': 'Mannheim-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142281-BV'}],\n", " 'coord': {'lat': '48.99439', 'lon': '8.400254'},\n", " 'id': 'stop_area:OCE:SA:80142281',\n", " 'label': 'Karlsruhe-Hbf',\n", " 'links': [],\n", " 'name': 'Karlsruhe-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-142778-BV'}],\n", " 'coord': {'lat': '48.790281', 'lon': '8.191165'},\n", " 'id': 'stop_area:OCE:SA:80142778',\n", " 'label': 'Baden-Baden',\n", " 'links': [],\n", " 'name': 'Baden-Baden',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.553204',\n", " 'lon': '7.97982'},\n", " 'id': 'admin:452982extern',\n", " 'insee': '',\n", " 'label': 'Appenweier',\n", " 'level': 8,\n", " 'name': 'Appenweier',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142893-BV'}],\n", " 'coord': {'lat': '48.541326', 'lon': '7.973672'},\n", " 'id': 'stop_area:OCE:SA:80142893',\n", " 'label': 'Appenweier (Appenweier)',\n", " 'links': [],\n", " 'name': 'Appenweier',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.550797',\n", " 'lon': '7.894595'},\n", " 'id': 'admin:452980extern',\n", " 'insee': '',\n", " 'label': 'Willst\u00e4tt',\n", " 'level': 8,\n", " 'name': 'Willst\u00e4tt',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142901-00'}],\n", " 'coord': {'lat': '48.558571', 'lon': '7.913724'},\n", " 'id': 'stop_area:OCE:SA:80142901',\n", " 'label': 'Legelshurst (Willst\u00e4tt)',\n", " 'links': [],\n", " 'name': 'Legelshurst',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.573151',\n", " 'lon': '7.811103'},\n", " 'id': 'admin:452979extern',\n", " 'insee': '',\n", " 'label': 'Kehl',\n", " 'level': 8,\n", " 'name': 'Kehl',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-142919-00'}],\n", " 'coord': {'lat': '48.570017', 'lon': '7.874009'},\n", " 'id': 'stop_area:OCE:SA:80142919',\n", " 'label': 'Kork (Kehl)',\n", " 'links': [],\n", " 'name': 'Kork',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-021402-BV'}],\n", " 'coord': {'lat': '48.365581', 'lon': '10.886756'},\n", " 'id': 'stop_area:OCE:SA:80021402',\n", " 'label': 'Augsburg-Hbf',\n", " 'links': [],\n", " 'name': 'Augsburg-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '42.427444',\n", " 'lon': '3.158865'},\n", " 'id': 'admin:345217extern',\n", " 'insee': '',\n", " 'label': 'Portbou',\n", " 'level': 8,\n", " 'name': 'Portbou',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0071-793158-BV'}],\n", " 'coord': {'lat': '42.424467', 'lon': '3.15786'},\n", " 'id': 'stop_area:OCE:SA:71793150',\n", " 'label': 'Port-Bou (Portbou)',\n", " 'links': [],\n", " 'name': 'Port-Bou',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '43.338318',\n", " 'lon': '-1.788809'},\n", " 'id': 'admin:346782extern',\n", " 'insee': '',\n", " 'label': 'Irun',\n", " 'level': 8,\n", " 'name': 'Irun',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0087-677914-WE'}],\n", " 'coord': {'lat': '43.339432', 'lon': '-1.801337'},\n", " 'id': 'stop_area:OCE:SA:71116000',\n", " 'label': 'Irun (Irun)',\n", " 'links': [],\n", " 'name': 'Irun',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251819-BV'}],\n", " 'coord': {'lat': '49.756761', 'lon': '6.652361'},\n", " 'id': 'stop_area:OCE:SA:80251819',\n", " 'label': 'Trier-Hbf',\n", " 'links': [],\n", " 'name': 'Trier-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251850-BV'}],\n", " 'coord': {'lat': '0.0', 'lon': '0.0'},\n", " 'id': 'stop_area:OCE:SA:80251850',\n", " 'label': 'Konz-Mitte',\n", " 'links': [],\n", " 'name': 'Konz-Mitte',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-251967-BV'}],\n", " 'coord': {'lat': '0.0', 'lon': '0.0'},\n", " 'id': 'stop_area:OCE:SA:80251967',\n", " 'label': 'Perl',\n", " 'links': [],\n", " 'name': 'Perl',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.896503',\n", " 'lon': '2.40198'},\n", " 'id': 'admin:67685extern',\n", " 'insee': '93055',\n", " 'label': 'Pantin (93500)',\n", " 'level': 8,\n", " 'name': 'Pantin',\n", " 'zip_code': '93500'}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0087-113209-BV'}],\n", " 'coord': {'lat': '48.897776', 'lon': '2.400426'},\n", " 'id': 'stop_area:OCE:SA:87113209',\n", " 'label': 'Pantin (Pantin)',\n", " 'links': [],\n", " 'name': 'Pantin',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.77924',\n", " 'lon': '9.181115'},\n", " 'id': 'admin:1107850extern',\n", " 'insee': '',\n", " 'label': 'Stuttgart-Mitte',\n", " 'level': 9,\n", " 'name': 'Stuttgart-Mitte',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-290346-BV'}],\n", " 'coord': {'lat': '48.783622', 'lon': '9.180496'},\n", " 'id': 'stop_area:OCE:SA:80290346',\n", " 'label': 'Stuttgart',\n", " 'links': [],\n", " 'name': 'Stuttgart',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.352497',\n", " 'lon': '8.117826'},\n", " 'id': 'admin:456995extern',\n", " 'insee': '',\n", " 'label': 'Neustadt-Stadtmitte',\n", " 'level': 9,\n", " 'name': 'Neustadt-Stadtmitte',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-194035-BV'}],\n", " 'coord': {'lat': '49.350034', 'lon': '8.140647'},\n", " 'id': 'stop_area:OCE:SA:80194035',\n", " 'label': 'Neustadt (Weinstr) Hbf',\n", " 'links': [],\n", " 'name': 'Neustadt (Weinstr) Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-194258-BV'}],\n", " 'coord': {'lat': '49.1976', 'lon': '8.12557'},\n", " 'id': 'stop_area:OCE:SA:80194258',\n", " 'label': 'Landau Hbf',\n", " 'links': [],\n", " 'name': 'Landau Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '45.325153',\n", " 'lon': '8.422766'},\n", " 'id': 'admin:1552703extern',\n", " 'insee': '',\n", " 'label': 'Vercelli (13100)',\n", " 'level': 8,\n", " 'name': 'Vercelli',\n", " 'zip_code': '13100'}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0083-002451-00'}],\n", " 'coord': {'lat': '45.329112', 'lon': '8.414824'},\n", " 'id': 'stop_area:OCE:SA:83002451',\n", " 'label': 'Vercelli (Vercelli)',\n", " 'links': [],\n", " 'name': 'Vercelli',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.094616',\n", " 'lon': '8.11692'},\n", " 'id': 'admin:1250497extern',\n", " 'insee': '',\n", " 'label': 'Winden',\n", " 'level': 8,\n", " 'name': 'Winden',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-194324-BV'}],\n", " 'coord': {'lat': '49.095415', 'lon': '8.122376'},\n", " 'id': 'stop_area:OCE:SA:80194324',\n", " 'label': 'WINDEN PFALZ (Winden)',\n", " 'links': [],\n", " 'name': 'WINDEN PFALZ',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-196980-BV'}],\n", " 'coord': {'lat': '49.43628', 'lon': '7.768563'},\n", " 'id': 'stop_area:OCE:SA:80196980',\n", " 'label': 'Kaiserslautern-Hbf',\n", " 'links': [],\n", " 'name': 'Kaiserslautern-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.13073',\n", " 'lon': '11.561022'},\n", " 'id': 'admin:54392extern',\n", " 'insee': '',\n", " 'label': 'Stadtbezirk 02 '\n", " 'Ludwigsvorstadt-Isarvorstadt',\n", " 'level': 9,\n", " 'name': 'Stadtbezirk 02 '\n", " 'Ludwigsvorstadt-Isarvorstadt',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-203471-00'}],\n", " 'coord': {'lat': '48.140325', 'lon': '11.560415'},\n", " 'id': 'stop_area:OCE:SA:80203471',\n", " 'label': 'Munchen-Hbf',\n", " 'links': [],\n", " 'name': 'Munchen-Hbf',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.573151',\n", " 'lon': '7.811103'},\n", " 'id': 'admin:452979extern',\n", " 'insee': '',\n", " 'label': 'Kehl',\n", " 'level': 8,\n", " 'name': 'Kehl',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0087-212910-WD'}],\n", " 'coord': {'lat': '48.576486', 'lon': '7.808005'},\n", " 'id': 'stop_area:OCE:SA:80142927',\n", " 'label': 'Kehl (Kehl)',\n", " 'links': [],\n", " 'name': 'Kehl',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.471657',\n", " 'lon': '7.944377'},\n", " 'id': 'admin:452988extern',\n", " 'insee': '',\n", " 'label': 'Offenburg',\n", " 'level': 8,\n", " 'name': 'Offenburg',\n", " 'zip_code': ''}],\n", " 'codes': [{'type': 'CR-CI-CH', 'value': '0080-143099-BV'}],\n", " 'coord': {'lat': '48.476447', 'lon': '7.946696'},\n", " 'id': 'stop_area:OCE:SA:80143099',\n", " 'label': 'Offenburg (Offenburg)',\n", " 'links': [],\n", " 'name': 'Offenburg',\n", " 'timezone': 'Europe/Paris'},\n", " {'codes': [{'type': 'CR-CI-CH', 'value': '0080-143503-BV'}],\n", " 'coord': {'lat': '47.997776', 'lon': '7.841564'},\n", " 'id': 'stop_area:OCE:SA:80143503',\n", " 'label': 'Freiburg-Breisgau',\n", " 'links': [],\n", " 'name': 'Freiburg-Breisgau',\n", " 'timezone': 'Europe/Paris'}]}\n"]}], "source": ["import pprint\n", "\n", "pprint.pprint(data)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Avec du javascript."]}, {"cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n"], "text/plain": [""]}, "execution_count": 6, "metadata": {}, "output_type": "execute_result"}], "source": ["from jyquickhelper import JSONJS\n", "JSONJS(data)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Pour exporter des donn\u00e9es en json"]}, {"cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": ["with open('./data_export.json','w') as f:\n", " json.dump(data,f)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il est aussi possible de passer par une chaine de caract\u00e8res. Exemple :"]}, {"cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["JSON : {\"name\": \"Mewtwo\", \"pokedex_id\": 150, \"type\": \"psychic\", \"location\": null, \"best\": true}\n", "DATA : {'name': 'Mewtwo', 'pokedex_id': 150, 'type': 'psychic', 'location': None, 'best': True}\n"]}], "source": ["import json\n", "\n", "data = {\n", " 'name' : 'Mewtwo',\n", " 'pokedex_id' : 150,\n", " 'type' : 'psychic',\n", " 'location':None,\n", " 'best':True\n", "}\n", "\n", "#L'encoding JSON g\u00e8re les types None, bool, int, float, str, lists, tuples et dictionaires.\n", "#L'encoding presque identique \u00e0 celui de Python, \u00e0 quelques diff\u00e9rences pr\u00e8s : \n", "#None <-> null\n", "#True <-> true\n", "#False <-> false\n", "\n", "json_str=json.dumps(data)\n", "print(\"JSON :\", json_str)\n", "\n", "data= json.loads(json_str)\n", "print(\"DATA :\", data)"]}, {"cell_type": "markdown", "metadata": {}, "source": ["Il est possible de trier les cl\u00e9s d'un JSON."]}, {"cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["{\"best\": true, \"location\": null, \"name\": \"Mewtwo\", \"pokedex_id\": 150, \"type\": \"psychic\"}\n"]}], "source": ["print(json.dumps(data,sort_keys=True))"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Requ\u00eater une API avec Python "]}, {"cell_type": "code", "execution_count": 9, "metadata": {"scrolled": false}, "outputs": [{"name": "stdout", "output_type": "stream", "text": ["{'context': {'current_datetime': '20221207T105949', 'timezone': 'Europe/Paris'},\n", " 'disruptions': [],\n", " 'feed_publishers': [{'id': 'sncf',\n", " 'license': 'Private (unspecified)',\n", " 'name': 'SNCF PIV Production',\n", " 'url': ''},\n", " {'id': 'SNCF:sncf-piv',\n", " 'license': 'Private (unspecified)',\n", " 'name': 'SNCF PIV Production',\n", " 'url': ''}],\n", " 'links': [{'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}',\n", " 'rel': 'stop_areas',\n", " 'templated': True,\n", " 'type': 'stop_areas'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/route_schedules',\n", " 'rel': 'route_schedules',\n", " 'templated': True,\n", " 'type': 'route_schedules'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/stop_schedules',\n", " 'rel': 'stop_schedules',\n", " 'templated': True,\n", " 'type': 'stop_schedules'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/arrivals',\n", " 'rel': 'arrivals',\n", " 'templated': True,\n", " 'type': 'arrivals'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/departures',\n", " 'rel': 'departures',\n", " 'templated': True,\n", " 'type': 'departures'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/places_nearby',\n", " 'rel': 'places_nearby',\n", " 'templated': True,\n", " 'type': 'places_nearby'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/journeys',\n", " 'rel': 'journeys',\n", " 'templated': True,\n", " 'type': 'journey'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas/{stop_areas.id}/traffic_reports',\n", " 'rel': 'disruptions',\n", " 'templated': True,\n", " 'type': 'disruption'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=1',\n", " 'templated': False,\n", " 'type': 'next'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas?start_page=196',\n", " 'templated': False,\n", " 'type': 'last'},\n", " {'href': 'https://api.sncf.com/v1/coverage/sncf/stop_areas',\n", " 'templated': False,\n", " 'type': 'first'}],\n", " 'pagination': {'items_on_page': 25,\n", " 'items_per_page': 25,\n", " 'start_page': 0,\n", " 'total_result': 4920},\n", " 'stop_areas': [{'codes': [{'type': 'secondary_id', 'value': 'SNCF:80194209'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80194225'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80194233'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80194332'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80197871'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80359331'},\n", " {'type': 'secondary_id', 'value': 'SNCF:80359349'},\n", " {'type': 'secondary_id', 'value': 'SNCF:85010017'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87641241'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87688051'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87713743'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87713875'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87714097'},\n", " {'type': 'secondary_id', 'value': 'SNCF:87757005'},\n", " {'type': 'source', 'value': '80194209'},\n", " {'type': 'source', 'value': '80194225'},\n", " {'type': 'source', 'value': '80194233'},\n", " {'type': 'source', 'value': '80194332'},\n", " {'type': 'source', 'value': '80197871'},\n", " {'type': 'source', 'value': '80359331'},\n", " {'type': 'source', 'value': '80359349'},\n", " {'type': 'source', 'value': '85010017'},\n", " {'type': 'source', 'value': '87407536'},\n", " {'type': 'source', 'value': '87641241'},\n", " {'type': 'source', 'value': '87688051'},\n", " {'type': 'source', 'value': '87713743'},\n", " {'type': 'source', 'value': '87713875'},\n", " {'type': 'source', 'value': '87714097'},\n", " {'type': 'source', 'value': '87757005'}],\n", " 'coord': {'lat': '0', 'lon': '0'},\n", " 'id': 'stop_area:SNCF:87407536',\n", " 'label': '',\n", " 'links': [],\n", " 'name': '',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.6977145',\n", " 'lon': '1.7646826'},\n", " 'id': 'admin:fr:60001',\n", " 'insee': '60001',\n", " 'label': 'Abancourt (60220)',\n", " 'level': 8,\n", " 'name': 'Abancourt',\n", " 'zip_code': '60220'}],\n", " 'codes': [{'type': 'source', 'value': '87313759'},\n", " {'type': 'uic', 'value': '87313759'}],\n", " 'coord': {'lat': '49.685621', 'lon': '1.774297'},\n", " 'id': 'stop_area:SNCF:87313759',\n", " 'label': 'Abancourt (Abancourt)',\n", " 'links': [],\n", " 'name': 'Abancourt',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '47.5525545',\n", " 'lon': '-1.5322775'},\n", " 'id': 'admin:fr:44001',\n", " 'insee': '44001',\n", " 'label': 'Abbaretz (44170)',\n", " 'level': 8,\n", " 'name': 'Abbaretz',\n", " 'zip_code': '44170'}],\n", " 'codes': [{'type': 'source', 'value': '87481614'},\n", " {'type': 'uic', 'value': '87481614'}],\n", " 'coord': {'lat': '47.555241', 'lon': '-1.524289'},\n", " 'id': 'stop_area:SNCF:87481614',\n", " 'label': 'Abbaretz (Abbaretz)',\n", " 'links': [],\n", " 'name': 'Abbaretz',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '50.1060835',\n", " 'lon': '1.8337029'},\n", " 'id': 'admin:fr:80001',\n", " 'insee': '80001',\n", " 'label': 'Abbeville (80100)',\n", " 'level': 8,\n", " 'name': 'Abbeville',\n", " 'zip_code': '80100'}],\n", " 'codes': [{'type': 'source', 'value': '87317362'},\n", " {'type': 'uic', 'value': '87317362'}],\n", " 'coord': {'lat': '50.102175', 'lon': '1.824538'},\n", " 'id': 'stop_area:SNCF:87317362',\n", " 'label': 'Abbeville (Abbeville)',\n", " 'links': [],\n", " 'name': 'Abbeville',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.7247582',\n", " 'lon': '2.421509'},\n", " 'id': 'admin:fr:94001',\n", " 'insee': '94001',\n", " 'label': 'Ablon-sur-Seine (94480)',\n", " 'level': 8,\n", " 'name': 'Ablon-sur-Seine',\n", " 'zip_code': '94480'}],\n", " 'codes': [{'type': 'source', 'value': '87545269'},\n", " {'type': 'uic', 'value': '87545269'}],\n", " 'coord': {'lat': '48.725443', 'lon': '2.419213'},\n", " 'id': 'stop_area:SNCF:87545269',\n", " 'label': 'Ablon (Ablon-sur-Seine)',\n", " 'links': [],\n", " 'name': 'Ablon',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.7247582',\n", " 'lon': '2.421509'},\n", " 'id': 'admin:fr:94001',\n", " 'insee': '94001',\n", " 'label': 'Ablon-sur-Seine (94480)',\n", " 'level': 8,\n", " 'name': 'Ablon-sur-Seine',\n", " 'zip_code': '94480'}],\n", " 'codes': [{'type': 'source', 'value': '87590588'},\n", " {'type': 'uic', 'value': '87590588'}],\n", " 'coord': {'lat': '48.72551', 'lon': '2.419155'},\n", " 'id': 'stop_area:SNCF:87590588',\n", " 'label': 'Ablon Noctilien (Ablon-sur-Seine)',\n", " 'links': [],\n", " 'name': 'Ablon Noctilien',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.2602817',\n", " 'lon': '6.3463759'},\n", " 'id': 'admin:fr:57001',\n", " 'insee': '57001',\n", " 'label': 'Aboncourt (57920)',\n", " 'level': 8,\n", " 'name': 'Aboncourt',\n", " 'zip_code': '57920'}],\n", " 'codes': [{'type': 'source', 'value': '87191403'},\n", " {'type': 'uic', 'value': '87191403'}],\n", " 'coord': {'lat': '49.261076', 'lon': '6.346603'},\n", " 'id': 'stop_area:SNCF:87191403',\n", " 'label': 'Aboncourt Mairie (Aboncourt)',\n", " 'links': [],\n", " 'name': 'Aboncourt Mairie',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '46.0980139',\n", " 'lon': '3.4450434'},\n", " 'id': 'admin:fr:03001',\n", " 'insee': '03001',\n", " 'label': 'Abrest (03200)',\n", " 'level': 8,\n", " 'name': 'Abrest',\n", " 'zip_code': '03200'}],\n", " 'codes': [{'type': 'source', 'value': '87721944'},\n", " {'type': 'uic', 'value': '87721944'}],\n", " 'coord': {'lat': '46.098868', 'lon': '3.444791'},\n", " 'id': 'stop_area:SNCF:87721944',\n", " 'label': 'Abrest Mairie (Abrest)',\n", " 'links': [],\n", " 'name': 'Abrest Mairie',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '47.6839847',\n", " 'lon': '3.6898895'},\n", " 'id': 'admin:fr:89130',\n", " 'insee': '89130',\n", " 'label': 'Deux Rivi\u00e8res (89460)',\n", " 'level': 8,\n", " 'name': 'Deux Rivi\u00e8res',\n", " 'zip_code': '89460'}],\n", " 'codes': [{'type': 'source', 'value': '87677252'},\n", " {'type': 'uic', 'value': '87677252'}],\n", " 'coord': {'lat': '47.663798', 'lon': '3.709584'},\n", " 'id': 'stop_area:SNCF:87677252',\n", " 'label': 'Accolay Le Pont (Deux Rivi\u00e8res)',\n", " 'links': [],\n", " 'name': 'Accolay Le Pont',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.8990413',\n", " 'lon': '2.0942792'},\n", " 'id': 'admin:fr:78551',\n", " 'insee': '78551',\n", " 'label': 'Saint-Germain-en-Laye '\n", " '(78100-78112)',\n", " 'level': 8,\n", " 'name': 'Saint-Germain-en-Laye',\n", " 'zip_code': '78100;78112'}],\n", " 'codes': [{'type': 'source', 'value': '87386052'},\n", " {'type': 'uic', 'value': '87386052'}],\n", " 'coord': {'lat': '48.955187', 'lon': '2.091962'},\n", " 'id': 'stop_area:SNCF:87386052',\n", " 'label': 'Ach\u00e8res Grand Cormier (Saint-Germain-en-Laye)',\n", " 'links': [],\n", " 'name': 'Ach\u00e8res Grand Cormier',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.8990413',\n", " 'lon': '2.0942792'},\n", " 'id': 'admin:fr:78551',\n", " 'insee': '78551',\n", " 'label': 'Saint-Germain-en-Laye '\n", " '(78100-78112)',\n", " 'level': 8,\n", " 'name': 'Saint-Germain-en-Laye',\n", " 'zip_code': '78100;78112'}],\n", " 'codes': [{'type': 'source', 'value': '87612978'},\n", " {'type': 'uic', 'value': '87612978'}],\n", " 'coord': {'lat': '48.955143', 'lon': '2.091769'},\n", " 'id': 'stop_area:SNCF:87612978',\n", " 'label': 'Acheres Grand Cormier Noctilien '\n", " '(Saint-Germain-en-Laye)',\n", " 'links': [],\n", " 'name': 'Acheres Grand Cormier Noctilien',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.9606321',\n", " 'lon': '2.0698106'},\n", " 'id': 'admin:fr:78005',\n", " 'insee': '78005',\n", " 'label': 'Ach\u00e8res (78260)',\n", " 'level': 8,\n", " 'name': 'Ach\u00e8res',\n", " 'zip_code': '78260'}],\n", " 'codes': [{'type': 'source', 'value': '87381657'},\n", " {'type': 'uic', 'value': '87381657'}],\n", " 'coord': {'lat': '48.97011', 'lon': '2.07739'},\n", " 'id': 'stop_area:SNCF:87381657',\n", " 'label': 'Ach\u00e8res Ville (Ach\u00e8res)',\n", " 'links': [],\n", " 'name': 'Ach\u00e8res Ville',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.9606321',\n", " 'lon': '2.0698106'},\n", " 'id': 'admin:fr:78005',\n", " 'insee': '78005',\n", " 'label': 'Ach\u00e8res (78260)',\n", " 'level': 8,\n", " 'name': 'Ach\u00e8res',\n", " 'zip_code': '78260'}],\n", " 'codes': [{'type': 'source', 'value': '87605444'},\n", " {'type': 'uic', 'value': '87605444'}],\n", " 'coord': {'lat': '48.96983', 'lon': '2.077253'},\n", " 'id': 'stop_area:SNCF:87605444',\n", " 'label': 'Acheres-Ville Noctilien (Ach\u00e8res)',\n", " 'links': [],\n", " 'name': 'Acheres-Ville Noctilien',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '50.1320114',\n", " 'lon': '2.7843609'},\n", " 'id': 'admin:fr:62005',\n", " 'insee': '62005',\n", " 'label': 'Achiet-le-Grand (62121)',\n", " 'level': 8,\n", " 'name': 'Achiet-le-Grand',\n", " 'zip_code': '62121'}],\n", " 'codes': [{'type': 'source', 'value': '87342048'},\n", " {'type': 'uic', 'value': '87342048'}],\n", " 'coord': {'lat': '50.131919', 'lon': '2.780112'},\n", " 'id': 'stop_area:SNCF:87342048',\n", " 'label': 'Achiet (Achiet-le-Grand)',\n", " 'links': [],\n", " 'name': 'Achiet',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.5567206',\n", " 'lon': '1.9790338'},\n", " 'id': 'admin:fr:60004',\n", " 'insee': '60004',\n", " 'label': 'Achy (60690)',\n", " 'level': 8,\n", " 'name': 'Achy',\n", " 'zip_code': '60690'}],\n", " 'codes': [{'type': 'source', 'value': '87316455'},\n", " {'type': 'uic', 'value': '87316455'}],\n", " 'coord': {'lat': '49.55473', 'lon': '1.979053'},\n", " 'id': 'stop_area:SNCF:87316455',\n", " 'label': 'Achy (Achy)',\n", " 'links': [],\n", " 'name': 'Achy',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.9052331',\n", " 'lon': '7.2036488'},\n", " 'id': 'admin:fr:67002',\n", " 'insee': '67002',\n", " 'label': 'Adamswiller (67320)',\n", " 'level': 8,\n", " 'name': 'Adamswiller',\n", " 'zip_code': '67320'}],\n", " 'codes': [{'type': 'source', 'value': '87658856'},\n", " {'type': 'uic', 'value': '87658856'}],\n", " 'coord': {'lat': '48.905635', 'lon': '7.208238'},\n", " 'id': 'stop_area:SNCF:87658856',\n", " 'label': 'Adamswiller Lotissement la For\u00eat (Adamswiller)',\n", " 'links': [],\n", " 'name': 'Adamswiller Lotissement la For\u00eat',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.9052331',\n", " 'lon': '7.2036488'},\n", " 'id': 'admin:fr:67002',\n", " 'insee': '67002',\n", " 'label': 'Adamswiller (67320)',\n", " 'level': 8,\n", " 'name': 'Adamswiller',\n", " 'zip_code': '67320'}],\n", " 'codes': [{'type': 'source', 'value': '87658922'},\n", " {'type': 'uic', 'value': '87658922'}],\n", " 'coord': {'lat': '48.903835', 'lon': '7.201179'},\n", " 'id': 'stop_area:SNCF:87658922',\n", " 'label': 'Adamswiller Mairie (Adamswiller)',\n", " 'links': [],\n", " 'name': 'Adamswiller Mairie',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.7126093',\n", " 'lon': '2.3637838'},\n", " 'id': 'admin:fr:91479',\n", " 'insee': '91479',\n", " 'label': 'Paray-Vieille-Poste '\n", " '(91550-94390)',\n", " 'level': 8,\n", " 'name': 'Paray-Vieille-Poste',\n", " 'zip_code': '91550;94390'}],\n", " 'codes': [{'type': 'source', 'value': '87495713'},\n", " {'type': 'uic', 'value': '87495713'}],\n", " 'coord': {'lat': '48.728337', 'lon': '2.359676'},\n", " 'id': 'stop_area:SNCF:87495713',\n", " 'label': 'A\u00e9rogare Orly Ouest (Paray-Vieille-Poste)',\n", " 'links': [],\n", " 'name': 'A\u00e9rogare Orly Ouest',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.7126093',\n", " 'lon': '2.3637838'},\n", " 'id': 'admin:fr:91479',\n", " 'insee': '91479',\n", " 'label': 'Paray-Vieille-Poste '\n", " '(91550-94390)',\n", " 'level': 8,\n", " 'name': 'Paray-Vieille-Poste',\n", " 'zip_code': '91550;94390'}],\n", " 'codes': [{'type': 'source', 'value': '87523548'},\n", " {'type': 'uic', 'value': '87523548'}],\n", " 'coord': {'lat': '48.728829', 'lon': '2.369614'},\n", " 'id': 'stop_area:SNCF:87523548',\n", " 'label': 'A\u00e9rogare Orly Sud (Paray-Vieille-Poste)',\n", " 'links': [],\n", " 'name': 'A\u00e9rogare Orly Sud',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.98020349999999',\n", " 'lon': '2.5589558'},\n", " 'id': 'admin:fr:93073',\n", " 'insee': '93073',\n", " 'label': 'Tremblay-en-France '\n", " '(93290)',\n", " 'level': 8,\n", " 'name': 'Tremblay-en-France',\n", " 'zip_code': '93290'}],\n", " 'codes': [{'type': 'source', 'value': '87271460'},\n", " {'type': 'uic', 'value': '87271460'}],\n", " 'coord': {'lat': '49.00956', 'lon': '2.56135'},\n", " 'id': 'stop_area:SNCF:87271460',\n", " 'label': 'A\u00e9roport Charles de Gaulle 1 (Tremblay-en-France)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles de Gaulle 1',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.98020349999999',\n", " 'lon': '2.5589558'},\n", " 'id': 'admin:fr:93073',\n", " 'insee': '93073',\n", " 'label': 'Tremblay-en-France '\n", " '(93290)',\n", " 'level': 8,\n", " 'name': 'Tremblay-en-France',\n", " 'zip_code': '93290'}],\n", " 'codes': [{'type': 'source', 'value': '87271494'},\n", " {'type': 'uic', 'value': '87271494'}],\n", " 'coord': {'lat': '49.003618', 'lon': '2.570812'},\n", " 'id': 'stop_area:SNCF:87271494',\n", " 'label': 'A\u00e9roport Charles de Gaulle 2 TGV '\n", " '(Tremblay-en-France)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles de Gaulle 2 TGV',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.0332971',\n", " 'lon': '2.5809475'},\n", " 'id': 'admin:fr:77282',\n", " 'insee': '77282',\n", " 'label': 'Mauregard (77990)',\n", " 'level': 8,\n", " 'name': 'Mauregard',\n", " 'zip_code': '77990'}],\n", " 'codes': [{'type': 'source', 'value': '87994210'},\n", " {'type': 'uic', 'value': '87994210'}],\n", " 'coord': {'lat': '49.013273', 'lon': '2.541919'},\n", " 'id': 'stop_area:SNCF:87994210',\n", " 'label': 'A\u00e9roport Charles de Gaulle T1 (Mauregard)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles de Gaulle T1',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '49.0172102',\n", " 'lon': '2.5910318'},\n", " 'id': 'admin:fr:77291',\n", " 'insee': '77291',\n", " 'label': 'Le Mesnil-Amelot '\n", " '(77990)',\n", " 'level': 8,\n", " 'name': 'Le Mesnil-Amelot',\n", " 'zip_code': '77990'}],\n", " 'codes': [{'type': 'source', 'value': '87994228'},\n", " {'type': 'uic', 'value': '87994228'}],\n", " 'coord': {'lat': '49.00436', 'lon': '2.571021'},\n", " 'id': 'stop_area:SNCF:87994228',\n", " 'label': 'A\u00e9roport Charles de Gaulle T2 (Le Mesnil-Amelot)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles de Gaulle T2',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.98020349999999',\n", " 'lon': '2.5589558'},\n", " 'id': 'admin:fr:93073',\n", " 'insee': '93073',\n", " 'label': 'Tremblay-en-France '\n", " '(93290)',\n", " 'level': 8,\n", " 'name': 'Tremblay-en-France',\n", " 'zip_code': '93290'}],\n", " 'codes': [{'type': 'source', 'value': '87994152'},\n", " {'type': 'uic', 'value': '87994152'}],\n", " 'coord': {'lat': '49.009976', 'lon': '2.561354'},\n", " 'id': 'stop_area:SNCF:87994152',\n", " 'label': 'A\u00e9roport Charles de Gaulle T3 (Tremblay-en-France)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles de Gaulle T3',\n", " 'timezone': 'Europe/Paris'},\n", " {'administrative_regions': [{'coord': {'lat': '48.98020349999999',\n", " 'lon': '2.5589558'},\n", " 'id': 'admin:fr:93073',\n", " 'insee': '93073',\n", " 'label': 'Tremblay-en-France '\n", " '(93290)',\n", " 'level': 8,\n", " 'name': 'Tremblay-en-France',\n", " 'zip_code': '93290'}],\n", " 'codes': [{'type': 'source', 'value': '87001479'},\n", " {'type': 'uic', 'value': '87001479'}],\n", " 'coord': {'lat': '49.003965', 'lon': '2.570665'},\n", " 'id': 'stop_area:SNCF:87001479',\n", " 'label': 'A\u00e9roport Charles-de-Gaulle 2 RER '\n", " '(Tremblay-en-France)',\n", " 'links': [],\n", " 'name': 'A\u00e9roport Charles-de-Gaulle 2 RER',\n", " 'timezone': 'Europe/Paris'}]}\n"]}], "source": ["import requests\n", "import pprint\n", "\n", "#token_auth='votre token ici, recu dans votre boite mail'\n", "token_auth=key\n", "\n", "url_avec_params='https://api.sncf.com/v1/coverage/sncf/stop_areas'\n", "\n", "r=requests.get(url_avec_params,auth=(token_auth,''))\n", "\n", "pprint.pprint(r.json())"]}, {"cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [{"data": {"text/html": ["
\n", "\n"], "text/plain": [""]}, "execution_count": 11, "metadata": {}, "output_type": "execute_result"}], "source": ["JSONJS(r.json())"]}, {"cell_type": "markdown", "metadata": {}, "source": ["A vous de jouer."]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Partie 1 - Trouver les gares accessibles _via_ la SNCF\n", "\n", "- Trouver l'ensemble des gares disponibles sur l'API et cr\u00e9er un fichier csv avec les codes de la gare, son nom et ses coordonn\u00e9es latitude et longitude, ainsi que les informations administratives de la r\u00e9gion quand elles sont disponibles\n", "\n", "- Repr\u00e9sentez les sur un graphique"]}, {"cell_type": "markdown", "metadata": {}, "source": ["## Les trajets depuis la Gare de Lyon"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Partons \u00e0 Lyon : le 17 novembre 2016 \u00e0 19h57\n", "\n", "Imaginez que vous vouliez un peu voyager hors de Paris, et il se trouve que justement on vous propose de passer quelques jours \u00e0 Lyon. Vous partez le 17 novembre vers 19h50 pour ne pas trop \u00e9courter votre journ\u00e9e de travail. "]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Question 1\n", "\n", "- Commencez par r\u00e9cup\u00e9rer les informations sur le trajet entre Paris Gare de Lyon et Lyon Perrache le 17 novembre \u00e0 19h57\n", "\n", " - Paris - Gare de Lyon (code de la gare : __stop\\_area:OCE:SA:87686006__)\n", "\n", " - Lyon - Gare Lyon Perrache (code de la gare : __stop\\_area:OCE:SA:87722025__)\n", " \n", " - Indice : utiliser la requ\u00eate \"journeys\"\n", " \n", " - Autre indice : le format de la date est AAAAMMJJTHHMMSS (Ann\u00e9e, mois, jour, heure, minutes, secondes)\n", " \n", "- R\u00e9pondez aux questions suivantes \n", " - combien y a-t-il d'arr\u00eats entre ces deux gares ? (utilisez la cl\u00e9 'journeys')\n", " - combien de temps d'arr\u00eat \u00e0 chacune d'elles ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Question 2\n", "Vous \u00eates un peu press\u00e9 et vous avez peur de vous tromper en arrivant \u00e0 la gare car d'autres TGV partent \u00e0 peu pr\u00e8s en m\u00eame temps (\u00e0 partir de 19h00) de la gare de Lyon. \n", "\n", "- Si vous demandez \u00e0 l'API, combien de r\u00e9sultats vous donne-t-elle ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["- Quels sont les horaires de d\u00e9part de ces trains ? "]}, {"cell_type": "markdown", "metadata": {}, "source": ["- Parmi ces trains, combien de trains ont pour destination finale Lyon et qui partent le 17 novembre ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### C'est quand qu'on va o\u00f9 ?\n", "\n", "- En fait, vous n'\u00eates plus tr\u00e8s s\u00fbr de vouloir aller \u00e0 Lyon. Mais bon maintenant vous \u00eates Gare de Lyon et il est 18h00. "]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Question 3\n", "\n", "- Combien de tgv partent entre 18h00 et 20h00 ?\n", "- Lequel arrive le plus t\u00f4t \u00e0 sa destination finale ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["### Et les correspondances ? "]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Question 4\n", "\n", "- On va essayer de voir jusqu'o\u00f9 on peut aller, en prenant des trains au d\u00e9part de la Gare de Lyon : \n", " - Quelles sont toutes les gares atteignables en partant le 17 novembre, sans faire de changement et sans partir apr\u00e8s minuit ?\n", " - Si on prend un de ces trains, jusqu'o\u00f9 peut-on aller, avec une correspondance, sans partir apr\u00e8s 8h le lendemain matin ?"]}, {"cell_type": "markdown", "metadata": {}, "source": ["##### Etape 1 : trouver toutes les correspondances possibles depuis le trajet entre les gares de Paris et de Perpignan\n", "\n", "Essayer de trouver toutes les correspondances possibles depuis un trajet entre Paris et Perpignan"]}, {"cell_type": "markdown", "metadata": {}, "source": ["##### Etape 2 : G\u00e9n\u00e9raliser et trouver toutes les correspondances possibles depuis les trains qu'on prend de la Gare de Lyon, le 17 novembre au soir\n", "\n", "Maintenant qu'on a fait un exemple, on le fait pour tous les trajets qui partent de la Gare de Lyon entre 18h et 20h de la Gare de Lyon\n", "\n", "Les correspondances elles devront partir avant 8h00 du matin le lendemain"]}, {"cell_type": "markdown", "metadata": {}, "source": ["#### Question 5\n", "- Repr\u00e9senter toutes les gares atteignables avec un graphique type scatter. Distinguer les gares atteintes en un seul trajet et celles atteintes avec une correspondance."]}, {"cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": []}], "metadata": {"anaconda-cloud": {}, "kernelspec": {"display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3"}, "language_info": {"codemirror_mode": {"name": "ipython", "version": 3}, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6"}}, "nbformat": 4, "nbformat_minor": 2}