Nous allons découvrir dans ce TP les données utilisées dans le projet à rendre, qui sont l'ensemble des transactions sur les horodateurs dans la ville de Paris sur l'année 2014. Celles-ci proviennent du site Open Data Paris, répertoire des donées ouvertes de la ville de Paris. Elles sont stockées sur le serveur MongoDB déjà utilisé, dans la base horodateurs
.
Elle contient deux collections principales :
transactions
: ensemble des paiementsmobiliers
: liste de tous les horodateursimport pymongo
import pandas
from pprint import pprint
con = pymongo.MongoClient("mongodb://193.51.82.104:2343/")
horo = con.horodateurs
horo.collection_names()
Il y a un grand nombre de transactions stockées dans la base (plus de 24 millions - cf ci-dessous).
horo.transactions.count()
Nous disposons d'un échantillon réduit de transactions (1%) permettant de tester rapidement le code qu'on ouhaite exécuter (plutôt que de lancer un code erroné ou trop lourd sur l'ensemble des données).
horo.transactions_small.count()
Nous disposons aussi de la liste des mobiliers, c'est-à-dire des horodateurs de la ville de Paris.
horo.mobiliers.count()
Pour avoir une estimation de la taille des données, nous récupérons l'ensemble des transactions de l'échantillon réduit dans un DataFrame
.
trans_small = pandas.DataFrame(list(horo.transactions_small.find()))
Il est maintenant possible de connaître la taille des données grâce à l'objet values.nbytes
du DataFrame
créé.
print(trans_small.values.nbytes)
L'objet finalement obtenu a donc une taille de presque 17 Mo (cf calcul ci-dessous).
trans_small.values.nbytes / (1024 * 1024) # En Mo
Une rapide estimation pour la totalité (grâce à une règle de trois) nous permet de voir que l'objet final contenant les transactions sur toute l'année (sans pré-calcul dans MongoDB) aurait une taille de plus de 1.6 Go. Il va donc falloir faire attention aux calculs que l'on va lancer, et aux choix de récupération de données qu'on va faire.
trans_small.values.nbytes / (1024 * 1024) * (horo.transactions.count() / horo.transactions_small.count())
Afin de mieux comprendre les données, nous affichons le premier document de chaque collection.
Pour les transactions, nous avons les informations présentées dans le fichier PDF joint avec les données (cf lien au début du TP). On a en particulier le numéro de l'horodateur dans l'item horodateur
. Celui-ci nous permettra de faire le lien avec l'autre collection.
pprint(horo.transactions.find_one())
Dans la collection mobiliers
, nous avons plusieurs informations (à voir aussi dans le PD joint sur cette page). On dispose bien évidemment du numéro d'horodateurs (avec l'attribut numhoro
), mais aussi de la localisation géographique de l'horodateur (sous différents formats, permettant leur utilisation de plusieurs façons).
pprint(horo.mobiliers.find_one())
Cette première partie à faire vous permettra de vous familariser avec les données.
alim
) et le nombre d'horodateurs pour chaque. arrondt
)modele
)regime
) et les arrondissements pour voir s'il y a des différences notablestarifhor
)montant carte
) et des durées payées (durée payée (h)
)moyen de paiement
) et le type d'usager (usager
), en ordonnant chaque table résultat par ordre décroissant du nombre de paiementsIl est possible de réaliser une jointure entre deux collections, dans un aggrégat, avec l'opérateur $lookup
.
Ci-dessous, nous nous restreignons aux transactions de l'horodateur 57080603
. Ensuite, nous récupérons les informations de celui-ci dans l'autre collection (indiquée dans le from
), via la jointure avec $lookup
. L'attribut localField
indique l'attribut à prendre dans la collection en cours et foreignField
l'attribut à prendre dans la collection indiquée dans le from
. La liste des mobiliers correspondants (1 seul normalement ici) est retournée dans un array
nommé via le as
. Ensuite, nous nous limitons aux 5 premiers résultats pour ne pas alourdir l'affichage.
res = horo.transactions_small.aggregate([
{ "$match": { "horodateur": 57080603}},
{ "$lookup": {
"from": "mobiliers",
"localField": "horodateur",
"foreignField": "fields.numhoro",
"as": "mobilier"
}},
{ "$limit": 5}
])
liste = list(res)
pprint(liste)