Main
keyG = "GGG" # facultatif
!!!! Moyenne, Médiane...
Sur différentes cartes, afficher les stations suivantes:
* stations dont l'altitude est inférieure à la moyenne (en conservant le code couleur précédent)
* stations dont l'altitude est supérieure à la médiane (en conservant le code couleur précédent)
----
!!! Tests de corrélation
* Calculer les corrélations entre les variables ''Altitude'' et ''Vélo disponible''
* Calculer les corrélations entre les variables ''Arrondissement'' et ''Vélo disponible''
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
Utiliser la méthode scatter.
!!! Questions
!!!! Distributions de probabilités
urlG = "http://maps.googleapis.com/maps/api/elevation/json?locations="
!!! Questions
!!!! Distributions de probabilités
Nous allons étudier les variables aléatoires suivantes:
* Arrondissement (Ar) [Premiers chiffres du champ 'number'
* Altitude (Al)
* Places totales (Ps)
* Places dispo (Pd)
Construire les matrices suivantes:
{$P$}
'''Solution 1: télécharger un fichier'''
Le fichier suivant regroupe les informations sur les stations velib au 11/09/2014 à 16h enrichi avec les altitudes (API Google)
[[(Attach:)dataVelib.pkl]]
'''Solution 2: les API rest'''
Main.TutoStat History
Show minor edits - Show changes to output
Changed line 19 from:
data = pkl.load(f)
to:
data = pkl.load(f, encoding='latin1') # option encoding pour le passage py2 => py3
Changed lines 102-103 from:
!!! Distributions de probabilités
to:
!!!%part% Distributions de probabilités
Changed lines 127-128 from:
!!! Tracer un histogramme
to:
!!!%part% Tracer un histogramme
Changed lines 147-148 from:
!!! Calcul et tracé d'une probabilité conditionnelle
to:
!!!%part% Calcul et tracé d'une probabilité conditionnelle
Changed line 174 from:
!!! Tracer la population des stations
to:
!!!%part% Tracer la population des stations
Added lines 1-3:
%define=part apply=block bgcolor=#e6d8c0%
Changed lines 9-10 from:
!!! Récupération des données
to:
!!!%part% Récupération des données
Changed line 23 from:
'''Solution 2: les API rest'''
to:
'''Solution 2: les API rest''' [Pour jouer '''A LA MAISON''']
Changed lines 38-39 from:
to:
Changed line 41 from:
alt = requests.get(urlGoogleAPI+position+"&key="+keyG)
to:
alt = requests.get(urlGoogleAPI+position)
Changed line 44 from:
time.sleep(0.2) # pour ne pas se faire bannir par Google
to:
time.sleep(0.1) # pour ne pas se faire bannir par Google
Changed line 225 from:
* Les challenges Kaggle: www.kaggle.com
to:
* Les challenges Kaggle: http://www.kaggle.com
Changed lines 218-225 from:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
to:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
----
!!! Pour s'amuser avec d'autres données:
* Beaucoup de choses sur Paris: http://opendata.paris.fr
* Les données classique UCI: https://archive.ics.uci.edu/ml/datasets.html
* Les challenges Kaggle: www.kaggle.com
----
!!! Pour s'amuser avec d'autres données:
* Beaucoup de choses sur Paris: http://opendata.paris.fr
* Les données classique UCI: https://archive.ics.uci.edu/ml/datasets.html
* Les challenges Kaggle: www.kaggle.com
Added lines 197-198:
!!!! Disponibilité:
Added lines 204-209:
!!!! Moyenne, Médiane...
Sur différentes cartes, afficher les stations suivantes:
* stations dont l'altitude est inférieure à la moyenne (en conservant le code couleur précédent)
* stations dont l'altitude est supérieure à la médiane (en conservant le code couleur précédent)
Changed line 156 from:
### Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
to:
### Tracer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
Changed line 147 from:
On s'intéresse à {$P[Vd | Al]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
to:
On s'intéresse à {$E[P[Vd | Al]]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
Changed lines 152-155 from:
# Pour chaque altitude
## Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
## Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
## Chercher les stations concernées [=réduction
to:
## Construire la table à 2 lignes et 30 colonnes de {$P[Vd | Al]$} en cherchant pour chaque altitude:
### Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
### Calculer la fréquence de Vd=1
### Calculer la fréquence de Vd=0
### Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
### Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
### Calculer la fréquence de Vd=1
### Calculer la fréquence de Vd=0
### Calculer {$P[Vd=1|Al]$} [={$P[Vd=1|Al]*1 + P[Vd=0|Al]*0$}estimation de l'espérance conditionnelle]
Changed line 210 from:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
to:
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
Changed lines 109-110 from:
* Au moins 3 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 3 vélos dans une stations pour être sûr de pouvoir en prendre un.]
to:
* Au moins 2 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 2 vélos dans une stations pour être sûr de pouvoir en prendre un.]
Deleted lines 143-144:
Changed lines 145-148 from:
!!! Tracer la population des stations
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:
to:
!!! Calcul et tracé d'une probabilité conditionnelle
On s'intéresse à {$P[Vd | Al]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
Voici les étapes à respecter
# calculer pour toutes les stations
## Vd = 1 si au moins 2 vélos dispos, Vd = 0 sinon
## Al = [0,...,29] catégorie d'altitude (cf aide ci-dessous pour ce calcul)
# Pour chaque altitude
## Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
## Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
On s'intéresse à {$P[Vd | Al]$}, c'est à dire, la probabilité d'avoir un vélo disponible en fonction de l'altitude.
Voici les étapes à respecter
# calculer pour toutes les stations
## Vd = 1 si au moins 2 vélos dispos, Vd = 0 sinon
## Al = [0,...,29] catégorie d'altitude (cf aide ci-dessous pour ce calcul)
# Pour chaque altitude
## Chercher les stations concernées [=réduction de l'univers pour les probas conditionnelles]
## Calculer la moyenne des Vd [=estimation de l'espérance conditionnelle]
Added lines 157-174:
# retrouver les catégories
# première colonne de station = altitude
# intervalle = largeur d'un intervalle
catAlt = np.floor((stations[:,1]-stations[:,1].min()) / intervalle)
# le début du code suivant peut-être
pDispoSAlt = np.zeros(np.unique(catAlt).shape[0])
for a in np.unique(catAlt): # fonction pratique pour isoler les valeurs uniques
[...]
(:sourceend:)
----
!!! Tracer la population des stations
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:
(:source lang=python:)
# première colonne de station = altitude
# intervalle = largeur d'un intervalle
catAlt = np.floor((stations[:,1]-stations[:,1].min()) / intervalle)
# le début du code suivant peut-être
pDispoSAlt = np.zeros(np.unique(catAlt).shape[0])
for a in np.unique(catAlt): # fonction pratique pour isoler les valeurs uniques
[...]
(:sourceend:)
----
!!! Tracer la population des stations
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:
(:source lang=python:)
Added lines 200-208:
----
!!! Tests de corrélation
* Calculer les corrélations entre les variables ''Altitude'' et ''Vélo disponible''
* Calculer les corrélations entre les variables ''Arrondissement'' et ''Vélo disponible''
Quel facteur est le plus lié au fait qu'(au moins) un vélo soit disponible dans une station?
Added lines 169-171:
%width=500px% Attach:2014_velibArrond.png
Tout est OK, on peut passer à l'exercice!
Tout est OK, on peut passer à l'exercice!
Deleted line 176:
Added lines 149-169:
!!!! Sanity check: affichage des arrondissements pour vérifier que tout est OK:
(:source lang=python:)
x1 = stations[:,3] # recuperation des coordonnées
x2 = stations[:,2]
# définition de tous les styles (pour distinguer les arrondissements)
style = [(s,c) for s in "o^+*" for c in "byrmck" ]
# tracé de la figure
plt.figure()
for i in range(1,21):
ind, = np.where(stations[:,0]==i)
# scatter c'est plus joli pour ce type d'affichage
plt.scatter(x1[ind],x2[ind],marker=style[i-1][0],c=style[i-1][1],linewidths=0)
plt.axis('equal') # astuce pour que les axes aient les mêmes espacements
plt.legend(range(1,21), fontsize=10)
plt.savefig("carteArrondissements.pdf")
(:sourceend:)
Afin de réviser les usages de @@np.where@@
(:source lang=python:)
x1 = stations[:,3] # recuperation des coordonnées
x2 = stations[:,2]
# définition de tous les styles (pour distinguer les arrondissements)
style = [(s,c) for s in "o^+*" for c in "byrmck" ]
# tracé de la figure
plt.figure()
for i in range(1,21):
ind, = np.where(stations[:,0]==i)
# scatter c'est plus joli pour ce type d'affichage
plt.scatter(x1[ind],x2[ind],marker=style[i-1][0],c=style[i-1][1],linewidths=0)
plt.axis('equal') # astuce pour que les axes aient les mêmes espacements
plt.legend(range(1,21), fontsize=10)
plt.savefig("carteArrondissements.pdf")
(:sourceend:)
Afin de réviser les usages de @@np.where@@
Deleted line 174:
Changed lines 143-154 from:
%width=200px% Attach:2014_histAlt.png
to:
%width=500px% Attach:2014_histAlt.png
----
!!! Tracer la population des stations
Projeter les stations sur la carte en mettant en:
* rouge les stations pleines,
* jaune les vides,
* verte les autres.
Utiliser la méthode scatter.
----
!!! Tracer la population des stations
Projeter les stations sur la carte en mettant en:
* rouge les stations pleines,
* jaune les vides,
* verte les autres.
Utiliser la méthode scatter.
Changed line 143 from:
%center width=200px% Attach:2014_histAlt.png
to:
%width=200px% Attach:2014_histAlt.png
Added line 143:
%center width=200px% Attach:2014_histAlt.png
Changed lines 127-141 from:
Tracer l'histogramme correspondant à la distribution {$P[Al]$}
to:
Tracer l'histogramme correspondant à la distribution {$P[Al]$}.\\
'''Attention:''' pour faire un tracé correct, il faut que l'aire de l'histogramme somme à 1. Il est donc nécessaire de réfléchir à la hauteur et largeur des différentes barres.
(:source lang=python:)
# stocker les altitudes + définir la largeur des intervalles:
alt = res[1]
intervalle = alt[1]-alt[0]
# définir la fréquence de répartition de la population dans les intervalles
pAlt = res[0]/res[0].sum()
# puis diviser la fréquence par la base de l'intervalle pour que ça somme à 1
pAlt /= intervalle
[...] # créer une figure
plt.bar((alt[1:]+alt[:-1])/2,pAlt, alt[1]-alt[0])
# NB: dans bar, on donne: abscisse, ordonnées, largeur des barres
(:sourceend:)
'''Attention:''' pour faire un tracé correct, il faut que l'aire de l'histogramme somme à 1. Il est donc nécessaire de réfléchir à la hauteur et largeur des différentes barres.
(:source lang=python:)
# stocker les altitudes + définir la largeur des intervalles:
alt = res[1]
intervalle = alt[1]-alt[0]
# définir la fréquence de répartition de la population dans les intervalles
pAlt = res[0]/res[0].sum()
# puis diviser la fréquence par la base de l'intervalle pour que ça somme à 1
pAlt /= intervalle
[...] # créer une figure
plt.bar((alt[1:]+alt[:-1])/2,pAlt, alt[1]-alt[0])
# NB: dans bar, on donne: abscisse, ordonnées, largeur des barres
(:sourceend:)
Changed lines 100-103 from:
!
to:
!!! Distributions de probabilités
Added lines 114-119:
(:source lang=python:)
nItervalles = 30
res = plt.hist(altitudes, nIntervalles)
print res[0] # effectif dans les intervalles
print res[1] # definition des intervalles (ATTENTION: 31 valeurs)
(:sourceend:)
nItervalles = 30
res = plt.hist(altitudes, nIntervalles)
print res[0] # effectif dans les intervalles
print res[1] # definition des intervalles (ATTENTION: 31 valeurs)
(:sourceend:)
Changed lines 122-128 from:
* {$P[Vd | Ar]$}
to:
* {$P[Vd | Ar]$}
----
!!! Tracer un histogramme
Tracer l'histogramme correspondant à la distribution {$P[Al]$}
----
!!! Tracer un histogramme
Tracer l'histogramme correspondant à la distribution {$P[Al]$}
Changed line 91 from:
Mise en forme:
to:
'''Mise en forme et élimination du bruit'''
Changed line 52 from:
>>block color="ffbbbb"<<
to:
>>block bgcolor=#ffbbbb<<
Changed lines 14-17 from:
to:
fname = "nomDeFichier.pkl"
f= open(fname,'rb')
data = pkl.load(f)
f.close()
f= open(fname,'rb')
data = pkl.load(f)
f.close()
Changed line 52 from:
>>block color="ffbbbbb"<<
to:
>>block color="ffbbbb"<<
Added lines 13-16:
(:source lang=python:)
(:sourceend:)
(:sourceend:)
Added line 46:
f.close()
Added lines 49-56:
>>block color="ffbbbbb"<<
'''Réflexe pickle:''' chaque fois que vous avez effectué des opérations coûteuses, penser à sauver le résultat! Le module pickle offre la possibilité de le faire en très peu de ligne!
(:source lang=python:)
f= open('coordVelib.pkl','wb')
pkl.dump(data,f) # penser à sauver les données pour éviter de refaire les opérations
f.close()
(:sourceend:)
>><<
'''Réflexe pickle:''' chaque fois que vous avez effectué des opérations coûteuses, penser à sauver le résultat! Le module pickle offre la possibilité de le faire en très peu de ligne!
(:source lang=python:)
f= open('coordVelib.pkl','wb')
pkl.dump(data,f) # penser à sauver les données pour éviter de refaire les opérations
f.close()
(:sourceend:)
>><<
Changed line 10 from:
Le fichier suivant regroupe les informations sur les stations velib au 11/09/2014 à 16h enrichi avec les altitudes (API Google)
to:
Le fichier suivant regroupe les informations sur les stations Vélib enrichies avec les altitudes (API Google)
Changed lines 1-3 from:
! Quelques exercices sur des données réelles
!! Velib
!! Velib
to:
! Quelques exercices sur des données réelles (Vélib)
Nous faisons l'hypothèse que les étudiants ont les connaissances de base en @@numpy@@ et @@matplotlib@@. Dans le cas contraire, se référer au premier tutoriel [[Main.TutoPython|lien]]
Nous faisons l'hypothèse que les étudiants ont les connaissances de base en @@numpy@@ et @@matplotlib@@. Dans le cas contraire, se référer au premier tutoriel [[Main.TutoPython|lien]]
Changed lines 30-31 from:
keyG = "GGG"
to:
keyG = "GGG" # facultatif
Changed line 35 from:
assert(alt.json()['status'] == "OK")
to:
assert(alt.json()['status'] == "OK") # verification de la réussite
Changed line 39 from:
f= open('coordVelib.pkl','w')
to:
f= open('coordVelib.pkl','wb')
Added lines 73-80:
Mise en forme:
Les données ne sont pas toutes correctes (comme la plupart des données réelles). Nous souhaitons aussi les mettre en forme dans un tableau.
* Faire défiler les stations
* Extraire l'arrondissement [Champ 'number' / 1000 en division entière] et vérifier qu'il est compris entre 1 et 20
* Eliminer les autres stations
* Définir une matrice du bon nombre de lignes avec les colonnes contenant: 3 coordonnées géographiques, Arrondissement, Places totales, Places dispo.
Les données ne sont pas toutes correctes (comme la plupart des données réelles). Nous souhaitons aussi les mettre en forme dans un tableau.
* Faire défiler les stations
* Extraire l'arrondissement [Champ 'number' / 1000 en division entière] et vérifier qu'il est compris entre 1 et 20
* Eliminer les autres stations
* Définir une matrice du bon nombre de lignes avec les colonnes contenant: 3 coordonnées géographiques, Arrondissement, Places totales, Places dispo.
Changed line 87 from:
* Arrondissement (Ar) [Premiers chiffres du champ 'number'
to:
* Arrondissement (Ar)
Changed lines 29-31 from:
to:
urlGoogleAPI = "https://maps.googleapis.com/maps/api/elevation/json?locations="
keyG = "GGG"
keyG = "GGG"
Changed lines 34-35 from:
alt = requests.get(urlGoogleAPI+position)
to:
alt = requests.get(urlGoogleAPI+position+"&key="+keyG)
assert(alt.json()['status'] == "OK")
assert(alt.json()['status'] == "OK")
Changed lines 87-88 from:
* {$P{Vd | Al]$}
* {$P{Vd | Ar]$}
* {$P
to:
* {$P[Vd | Al]$}
* {$P[Vd | Ar]$}
* {$P[Vd | Ar]$}
Changed lines 78-80 from:
* Places totales (Ps)
* Places dispo (Pd)
*Borne pleine (Bp)
* Places dispo (Pd)
*
to:
%comment% * Places totales (Ps)
%comment% * Places dispo (Pd)
* Station pleine (Sp) [variable binaire: valeur 1 si la station est pleine]
%comment% * Places dispo (Pd)
* Station pleine (Sp) [variable binaire: valeur 1 si la station est pleine]
Changed lines 86-88 from:
*
to:
* {$P[Sp | Al]$}
* {$P{Vd | Al]$}
* {$P{Vd | Ar]$}
* {$P{Vd | Al]$}
* {$P{Vd | Ar]$}
Added line 74:
Dans notre population, les individus sont des stations, qui ont différents caractères.
Changed lines 80-82 from:
to:
* Borne pleine (Bp)
* Au moins 3 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 3 vélos dans une stations pour être sûr de pouvoir en prendre un.]
* Au moins 3 vélos disponibles (variable binaire) (Vd) [comme il y a souvent des vélos en panne, on considère qu'il faut 3 vélos dans une stations pour être sûr de pouvoir en prendre un.]
Changed lines 84-86 from:
{$P$}
to:
* {$P[Ar]$}
* {$P[Al]$} nous utiliserons une discrétisation de l'altitude en 100 intervalles de mêmes tailles
*
* {$P[Al]$} nous utiliserons une discrétisation de l'altitude en 100 intervalles de mêmes tailles
*
Added lines 69-81:
!!! Questions
!!!! Distributions de probabilités
Nous allons étudier les variables aléatoires suivantes:
* Arrondissement (Ar) [Premiers chiffres du champ 'number'
* Altitude (Al)
* Places totales (Ps)
* Places dispo (Pd)
Construire les matrices suivantes:
{$P$}
Changed lines 55-68 from:
*'status': u'OPEN'}
to:
*'status': u'OPEN'}
Pour faire défiler les stations dans la structure @@data@@:
(:source lang=python:)
for station in data:
...
(:sourceend:)
Pour accéder à un champ d'une station:
(:source lang=python:)
for station in data:
nbVeloDispo = station['available_bikes']
...
(:sourceend:)
Pour faire défiler les stations dans la structure @@data@@:
(:source lang=python:)
for station in data:
...
(:sourceend:)
Pour accéder à un champ d'une station:
(:source lang=python:)
for station in data:
nbVeloDispo = station['available_bikes']
...
(:sourceend:)
Changed lines 38-55 from:
(:sourceend:)
to:
(:sourceend:)
!!! Structure des données
Les données sont dans une liste de dictionnaire (ie chaque station est un dictionnaire python). Les champs du dictionnaire sont:
*'address': u"57 RUE DU CHATEAU D'EAU - 75010 PARIS",
*'alt': 35.79555130004883,
*'available_bike_stands': 2,
*'available_bikes': 17,
*'banking': True,
*'bike_stands': 19,
*'bonus': False,
*'contract_name': u'Paris',
*'last_update': 1410442143000,
*'name': u"10007 - CHATEAU D'EAU",
*'number': 10007,
*'position': {u'lat': 48.87242997325711, u'lng': 2.355489390173873},
*'status': u'OPEN'}
!!! Structure des données
Les données sont dans une liste de dictionnaire (ie chaque station est un dictionnaire python). Les champs du dictionnaire sont:
*'address': u"57 RUE DU CHATEAU D'EAU - 75010 PARIS",
*'alt': 35.79555130004883,
*'available_bike_stands': 2,
*'available_bikes': 17,
*'banking': True,
*'bike_stands': 19,
*'bonus': False,
*'contract_name': u'Paris',
*'last_update': 1410442143000,
*'name': u"10007 - CHATEAU D'EAU",
*'number': 10007,
*'position': {u'lat': 48.87242997325711, u'lng': 2.355489390173873},
*'status': u'OPEN'}
Changed lines 37-38 from:
pkl.dump(data,f)(:sourceend:)
to:
pkl.dump(data,f) # penser à sauver les données pour éviter de refaire les opérations
(:sourceend:)
(:sourceend:)
Added lines 19-22:
import requests
import pickle as pkl
import time
import pickle as pkl
import time
Changed line 37 from:
pkl.dump(data,f)(:sourceend:)
to:
pkl.dump(data,f)(:sourceend:)
Changed lines 22-33 from:
(:sourceend:)
to:
(:sourceend:)
# enrichissement avec l'altitude à partir de l'API Google:
(:source lang=python:)
urlG = "http://maps.googleapis.com/maps/api/elevation/json?locations="
for s in data:
position = "%f,%f"%(s['position']['lat'],s['position']['lng'])
alt = requests.get(urlGoogleAPI+position)
s[u'alt'] = alt.json()['results'][0]['elevation'] # enrichissement
time.sleep(0.2) # pour ne pas se faire bannir par Google
f= open('coordVelib.pkl','w')
pkl.dump(data,f)(:sourceend:)
# enrichissement avec l'altitude à partir de l'API Google:
(:source lang=python:)
urlG = "http://maps.googleapis.com/maps/api/elevation/json?locations="
for s in data:
position = "%f,%f"%(s['position']['lat'],s['position']['lng'])
alt = requests.get(urlGoogleAPI+position)
s[u'alt'] = alt.json()['results'][0]['elevation'] # enrichissement
time.sleep(0.2) # pour ne pas se faire bannir par Google
f= open('coordVelib.pkl','w')
pkl.dump(data,f)(:sourceend:)
Added lines 6-13:
'''Solution 1: télécharger un fichier'''
Le fichier suivant regroupe les informations sur les stations velib au 11/09/2014 à 16h enrichi avec les altitudes (API Google)
[[(Attach:)dataVelib.pkl]]
'''Solution 2: les API rest'''
Added line 5:
!!! Récupération des données
Changed lines 8-14 from:
# récupération d'une clé
to:
# récupération d'une clé (XXX)
#Début du code:
(:source lang=python:)
url = "https://api.jcdecaux.com/vls/v1/stations?contract=Paris&apiKey=XXX"
dataStation = requests.get(url)
data = dataStation.json()
(:sourceend:)
#Début du code:
(:source lang=python:)
url = "https://api.jcdecaux.com/vls/v1/stations?contract=Paris&apiKey=XXX"
dataStation = requests.get(url)
data = dataStation.json()
(:sourceend:)
Changed lines 6-7 from:
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]
to:
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]
# récupération d'une clé
# récupération d'une clé
Added lines 1-6:
! Quelques exercices sur des données réelles
!! Velib
Nous proposons de tracer quelques courbes de probabilité sur des données velib récupérée directement sur le web.
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]
!! Velib
Nous proposons de tracer quelques courbes de probabilité sur des données velib récupérée directement sur le web.
# première étape: récupération des données, création d'un compte sur: [[https://developer.jcdecaux.com/#/signup]]