Introduction à MongoDB¶

FX Jollois¶

DU Analyste Data Science¶

  1. Présentation de MongoDB
  2. Connection depuis Python et interrogation de données

Présentation de MongoDB¶

Base de données NoSQL de type Document Store (orienté document)

Objectifs :

  • Gestion possible de gros volumes de données
  • Facilité de déploiement et d'utilsiation
  • Possibilité de faire de choses assez complexes

Plus d'informations sur leur site

Modèle des données¶

Principe de base : les données sont des documents

  • Stocké en Binary JSON (BSON)
  • Documents similaires rassemblés dans des collections
    • plusieurs collections possibles dans une base de données
  • Pas de schéma des documents définis en amont
    • contrairement à un BD relationnel ou NoSQL de type Column Store
  • Les documents peuvent n'avoir aucun point commun entre eux
  • Un document contient (généralement) l'ensemble des informations
    • pas (ou très peu) de jointure à faire idéalement
  • BD respectant CP (dans le théorème CAP)
    • propriétés ACID au niveau d'un document

Format JSON¶

  • JavaScript Object Notation, créé en 2005
  • Format léger d'échange de données structurées (littéral)
  • Schéma des données non connu (contenu dans les données)
  • Basé sur deux notions :
    • collection de couples clé/valeur
    • liste de valeurs ordonnées
  • Structures possibles :
    • objet (couples clé/valeur) : { "nom": "jollois", "prenom": "fx" }
    • tableau (collection de valeurs) : [ 1, 5, 10]
    • une valeur dans un objet ou dans un tableau peut être elle-même un littéral
  • Deux types atomiques (string et number) et trois constantes (true, false, null)

Validation possible du JSON sur jsonlint.com/

Exemple de JSON¶

{
    "address": {
        "building": "469",
        "coord": [
            -73.9617,
            40.6629
        ],
        "street": "Flatbush Avenue",
        "zipcode": "11225"
    },
    "borough": "Brooklyn",
    "cuisine": "Hamburgers",
    "grades": [
        {
            "date": "2014-12-30 01:00:00",
            "grade": "A",
            "score": 8
        },
        {
            "date": "2014-07-01 02:00:00",
            "grade": "B",
            "score": 23
        }
    ],
    "name": "Wendy'S",
    "restaurant_id": "30112340"
}

Compléments¶

BSON : extension de JSON

  • Quelques types supplémentaires (identifiant spécifique, binaire, date, ...)
  • Distinction entier et réel

Schéma dynamique

  • Documents variant très fortement entre eux, même dans une même collection
  • On parle de self-describing documents
  • Ajout très facile d'un nouvel élément pour un document, même si cet élément est inexistant pour les autres
  • Pas de ALTER TABLE ou de redesign de la base

Langage d'interrogation¶

  • Pas de SQL (bien évidemment), ni de langage proche
  • Définition d'un langage propre
    • find() : pour tout ce qui est restriction et projection
    • aggregate() : pour tout ce qui est calcul de variable, d'aggrégats et de manipulations diverses
    • ...
  • Langage JavaScript dans la console, permettant plus que les accès aux données
    • définition de variables
    • boucles
    • ...

Interaction entre Python et MongoDB¶

Utilisation du package pymongo

Connexion à un serveur distant¶

  • Utilisation d'une URI spécifique, avec login et passeword intégrés
  • Si connexion serveur local (suite à installation selon ces instructions), pas besoin de mettre de paramètre à la fonction pymongo.MongoClient()
In [1]:
import pymongo
URI = 'mongodb+srv://user:user@cluster0.ougec.mongodb.net/test'
client = pymongo.MongoClient(URI) # enlever le paramètre URI si connexion locale
db = client.test

Exemples sur restaurants¶

Dans ce document, nous allons travailler sur une base des restaurants New-Yorkais.

Voici le premier document est présenté ci-dessous sur les plus de 25000 restaurants new-yorkais (base de test fournie par Mongo)

{
        "_id" : ObjectId("58ac16d1a251358ee4ee87de"),
        "address" : {
                "building" : "469",
                "coord" : [
                        -73.961704,
                        40.662942
                ],
                "street" : "Flatbush Avenue",
                "zipcode" : "11225"
        },
        "borough" : "Brooklyn",
        "cuisine" : "Hamburgers",
        "grades" : [
                {
                        "date" : ISODate("2014-12-30T00:00:00Z"),
                        "grade" : "A",
                        "score" : 8
                },
                {
                        "date" : ISODate("2014-07-01T00:00:00Z"),
                        "grade" : "B",
                        "score" : 23
                },
                {
                        "date" : ISODate("2013-04-30T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                },
                {
                        "date" : ISODate("2012-05-08T00:00:00Z"),
                        "grade" : "A",
                        "score" : 12
                }
        ],
        "name" : "Wendy'S",
        "restaurant_id" : "30112340"
}

Document dans python¶

Les données JSON sont similaires à un dictionnaire python. Pour récupérer le premier document, nous utilisons la fonction find() de l'objet créé m.

In [2]:
d = db.restaurants.find(limit = 1)
d
Out[2]:
<pymongo.cursor.Cursor at 0x109fac760>

L'objet retourné est un curseur, et non le résultat. Nous avons celui-ci lorsque nous utilisons d dans une commande telle qu'une transformation en list par exemple. Une fois le résultat retourné (un seul élément ici), le curseur ne renvoie plus rien

In [3]:
list(d)
Out[3]:
[{'_id': ObjectId('60006d6aa7aafd5a6d45ca9a'),
  'address': {'building': '1007',
   'coord': [-73.856077, 40.848447],
   'street': 'Morris Park Ave',
   'zipcode': '10462'},
  'borough': 'Bronx',
  'cuisine': 'Bakery',
  'grades': [{'date': datetime.datetime(2014, 3, 3, 0, 0),
    'grade': 'A',
    'score': 2},
   {'date': datetime.datetime(2013, 9, 11, 0, 0), 'grade': 'A', 'score': 6},
   {'date': datetime.datetime(2013, 1, 24, 0, 0), 'grade': 'A', 'score': 10},
   {'date': datetime.datetime(2011, 11, 23, 0, 0), 'grade': 'A', 'score': 9},
   {'date': datetime.datetime(2011, 3, 10, 0, 0), 'grade': 'B', 'score': 14}],
  'name': 'Morris Park Bake Shop',
  'restaurant_id': '30075445'}]
In [4]:
list(d)
Out[4]:
[]

Dénombrement¶

  • Fonction count_documents({}) pour dénombrer les documents
    • le paramètre {} est à mettre obligatoirement
    • nous verrons juste après à quoi il sert
  • Fonction estimated_document_count() pour estimer le nombre de documents, à utiliser de préférence en cas de multiples serveurs et de données massives

Tous les restaurants¶

In [5]:
db.restaurants.count_documents({})
Out[5]:
25359
In [6]:
db.restaurants.estimated_document_count()
Out[6]:
25359

Sélection de documents¶

Pour sélectionner les documents, nous allons utiliser le paramètre dans la fonction count_documents() (ainsi que dans les fonctions distinct() et find() que nous verrons plus tard).

  • {} : tous les documents
  • { "champs": valeur } : documents ayant cette valeur pour ce champs
  • { condition1, condition2 } : documents remplissant la condition 1 ET la condition 2
  • "champs.sous_champs" : permet d'accéder donc à un sous-champs d'un champs (que celui-ci soit un littéral ou un tableau)
  • { "champs": { "$opérateur": expression }} : utilisation d'opérateurs dans la recherche
    • $in : comparaison à un ensemble de valeurs
    • $gt, $gte, $lt, $lte, $ne : comparaison (resp. greater than, greater than or equal, less than, less than or equal, not equal)

Comptage de certains documents¶

  • Restaurants de Brooklyn
In [7]:
db.restaurants.count_documents({ "borough": "Brooklyn" })
Out[7]:
6086
  • Restaurants de Brooklyn proposant de la cuisine française
In [8]:
db.restaurants.count_documents({ "borough": "Brooklyn", "cuisine": "French" })
Out[8]:
54

Comptage de certains documents (suite)¶

  • Restaurants de Brooklyn proposant de la cuisine française ou italienne
In [9]:
db.restaurants.count_documents({ "borough": "Brooklyn", "cuisine": { "$in": ["French", "Italian"]} })
Out[9]:
246
  • Idem mais écrit plus lisiblement
In [10]:
db.restaurants.count_documents(
  { 
    "borough": "Brooklyn", 
    "cuisine": { "$in": ["French", "Italian"]}
  }
)
Out[10]:
246

Comptage de certains documents (suite)¶

  • Restaurants situés sur Franklin Street
    • Notez l'accès au champs street du champs address
In [11]:
db.restaurants.count_documents(
  { 
    "address.street": "Franklin Street"
  }
)
Out[11]:
25
  • Restaurants ayant eu un score de 0
In [12]:
db.restaurants.count_documents(
  { 
    "grades.score": 0
  }
)
Out[12]:
1246

Comptage de certains documents¶

  • Restaurants ayant eu un score inférieur à 5
In [13]:
db.restaurants.count_documents(
  { 
    "grades.score": { "$lte": 5 }
  }
)
Out[13]:
10650

Valeurs distinctes¶

On peut aussi voir la liste des valeurs distinctes d'un attribut, avec la fonction distinct().

  • Quartier (borough), pour tous les restaurants
In [14]:
db.restaurants.distinct(key = "borough")
Out[14]:
['Bronx', 'Brooklyn', 'Manhattan', 'Missing', 'Queens', 'Staten Island']

Valeurs distinctes (suite)¶

  • Cuisine pour les restaurants de Brooklyn
In [15]:
db.restaurants.distinct(
  key = "cuisine",
  query = { "borough": "Brooklyn" }
)
Out[15]:
['Afghan',
 'African',
 'American ',
 'Armenian',
 'Asian',
 'Australian',
 'Bagels/Pretzels',
 'Bakery',
 'Bangladeshi',
 'Barbecue',
 'Bottled beverages, including water, sodas, juices, etc.',
 'Brazilian',
 'Café/Coffee/Tea',
 'Cajun',
 'Caribbean',
 'Chicken',
 'Chilean',
 'Chinese',
 'Chinese/Cuban',
 'Chinese/Japanese',
 'Continental',
 'Creole',
 'Creole/Cajun',
 'Czech',
 'Delicatessen',
 'Donuts',
 'Eastern European',
 'Egyptian',
 'English',
 'Ethiopian',
 'Filipino',
 'French',
 'Fruits/Vegetables',
 'German',
 'Greek',
 'Hamburgers',
 'Hawaiian',
 'Hotdogs',
 'Hotdogs/Pretzels',
 'Ice Cream, Gelato, Yogurt, Ices',
 'Indian',
 'Indonesian',
 'Irish',
 'Italian',
 'Japanese',
 'Jewish/Kosher',
 'Juice, Smoothies, Fruit Salads',
 'Korean',
 'Latin (Cuban, Dominican, Puerto Rican, South & Central American)',
 'Mediterranean',
 'Mexican',
 'Middle Eastern',
 'Moroccan',
 'Not Listed/Not Applicable',
 'Nuts/Confectionary',
 'Other',
 'Pakistani',
 'Pancakes/Waffles',
 'Peruvian',
 'Pizza',
 'Pizza/Italian',
 'Polish',
 'Portuguese',
 'Russian',
 'Salads',
 'Sandwiches',
 'Sandwiches/Salads/Mixed Buffet',
 'Scandinavian',
 'Seafood',
 'Soul Food',
 'Soups & Sandwiches',
 'Southwestern',
 'Spanish',
 'Steak',
 'Tapas',
 'Tex-Mex',
 'Thai',
 'Turkish',
 'Vegetarian',
 'Vietnamese/Cambodian/Malaysia']

Valeurs distinctes (suite)¶

  • Grade des restaurants de Brooklyn
In [16]:
db.restaurants.distinct(
  key = "grades.grade",
  query = { "borough": "Brooklyn" }
)
Out[16]:
['A', 'B', 'C', 'Not Yet Graded', 'P', 'Z']

Restriction et Projection¶

  • Fonction find() pour réaliser les restrictions et projections
  • Plusieurs paramètres :
    • Restriction (quels documents prendre) : même format que précédemment
    • Projection (quels champs afficher)
    • limit pour n'avoir que les $n$ premiers documents
    • sort pour effectuer un tri des documents
  • Renvoie un curseur, qu'il faut donc gérer pour avoir le résultat
  • Transformation en DataFrame (du module pandas)
    • Format pas forcément idéal pour certains champs

Sélection de champs à afficher ou non¶

Dans la fonction find(), pour choisir les champs à afficher, le deuxième paramètre permet de faire une projection avec les critères suivants :

  • sans précision, l'identifiant interne est toujours affiché (_id)
  • { "champs": 1 } : champs à afficher
  • { "champs": 0 } : champs à ne pas afficher
  • Pas de mélange des 2 sauf pour l'identifiant interne à Mongo (_id)
    • { "_id": 0, "champs": 1, ...}

Tri et limite¶

Toujours dans la fonction find(), il est possible de faire le tri des documents, avec le paramètre sort qui prend un tuple composé de 1 ou plusieurs tuples indiquant les critères de tri

  • ( "champs", 1 ) : tri croissant
  • ( "champs", -1 ) : tri décroissant
  • plusieurs critères de tri possibles (dans les 2 sens)

Dans ces fonctions, on peut aussi limiter l'exploration à une partie, avec les paramètres suivant :

  • limit : restreint le nombre de résultats fournis
  • skip : ne considère pas les n premiers documents

Récupération des 5 premiers documents¶

Notez le contenu des colonnes address et grades.

In [17]:
import pandas
pandas.DataFrame(db.restaurants.find(limit = 5))
Out[17]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068

Récupération de documents (suite)¶

  • Restaurants Shake Shack (uniquement les attributs "street" et "borough")
In [18]:
c = db.restaurants.find({ "name": "Shake Shack" }, { "address.street": 1, "borough": 1 })
pandas.DataFrame(c)
Out[18]:
_id address borough
0 60006d6ca7aafd5a6d45ec73 {'street': 'Columbus Avenue'} Manhattan
1 60006d6ca7aafd5a6d45f66d {'street': 'West 44 Street'} Manhattan
2 60006d6ca7aafd5a6d45f66e {'street': 'East 86 Street'} Manhattan
3 60006d6ca7aafd5a6d45fe35 {'street': 'North End Avenue'} Manhattan
4 60006d6ca7aafd5a6d45ff7f {'street': 'Fulton Street'} Brooklyn
5 60006d6da7aafd5a6d461437 {'street': 'Jfk International Airport'} Queens
6 60006d6da7aafd5a6d4618f1 {'street': 'Grand Central Terminal'} Manhattan
7 60006d6da7aafd5a6d46197c {'street': 'Jfk International Airport'} Queens
8 60006d6ea7aafd5a6d462178 {'street': 'Old Fulton Street'} Brooklyn
9 60006d6ea7aafd5a6d46217a {'street': 'Flatbush Avenue'} Brooklyn
10 60006d6ea7aafd5a6d462955 {'street': '3Rd Ave'} Manhattan

Récupération de documents (suite)¶

  • Idem sans l'identifiant interne
In [19]:
c = db.restaurants.find(
    { "name": "Shake Shack" }, 
    { "_id": 0, "address.street": 1, "borough": 1 }
)
pandas.DataFrame(c)
Out[19]:
address borough
0 {'street': 'Columbus Avenue'} Manhattan
1 {'street': 'West 44 Street'} Manhattan
2 {'street': 'East 86 Street'} Manhattan
3 {'street': 'North End Avenue'} Manhattan
4 {'street': 'Fulton Street'} Brooklyn
5 {'street': 'Jfk International Airport'} Queens
6 {'street': 'Grand Central Terminal'} Manhattan
7 {'street': 'Jfk International Airport'} Queens
8 {'street': 'Old Fulton Street'} Brooklyn
9 {'street': 'Flatbush Avenue'} Brooklyn
10 {'street': '3Rd Ave'} Manhattan

Récupération de documents (suite)¶

  • 5 premiers restaurants du quartier Queens, avec une note A et un score supérieur à 50 (on affiche le nom et la rue du restaurant
In [20]:
c = db.restaurants.find(
    {"borough": "Queens", "grades.score": { "$gte":  50}},
    {"_id": 0, "name": 1, "grades.score": 1, "address.street": 1},
    limit = 5
)
pandas.DataFrame(c)
Out[20]:
address grades name
0 {'street': 'Horace Harding Boulevard'} [{'score': 12}, {'score': 4}, {'score': 11}, {... Richer'S Bakery
1 {'street': 'Bell Boulevard'} [{'score': 52}, {'score': 12}, {'score': 22}, ... Tequilla Sunrise
2 {'street': 'Rockaway Beach Boulevard'} [{'score': 10}, {'score': 2}, {'score': 10}, {... Rockaway Beach Inn
3 {'street': 'Broadway'} [{'score': 13}, {'score': 13}, {'score': 13}, ... Alfonso'S Bar
4 {'street': 'Woodhaven Boulevard'} [{'score': 2}, {'score': 64}, {'score': 9}, {'... Pio Pio

Récupération de documents (suite)¶

  • Restaurants Shake Shack dans différents quartiers (Queens et Brooklyn)
In [21]:
c = db.restaurants.find(
    {"name": "Shake Shack", "borough": {"$in": ["Queens", "Brooklyn"]}}, 
    {"_id": 0, "address.street": 1, "borough": 1}
)
pandas.DataFrame(c)
Out[21]:
address borough
0 {'street': 'Fulton Street'} Brooklyn
1 {'street': 'Jfk International Airport'} Queens
2 {'street': 'Jfk International Airport'} Queens
3 {'street': 'Old Fulton Street'} Brooklyn
4 {'street': 'Flatbush Avenue'} Brooklyn

Récupération de documents (suite)¶

  • Restaurants du Queens ayant une note supérieure à 50, mais trié par ordre décroissant de noms de rue, et ordre croissant de noms de restaurants
In [22]:
c = db.restaurants.find(
    {"borough": "Queens", "grades.score": { "$gt":  50}},
    {"_id": 0, "name": 1, "address.street": 1},
    sort = (("address.street", -1), ("name", 1))
)
pandas.DataFrame(c)
Out[22]:
address name
0 {'street': 'Woodward Avenue'} Sabores Restaurant & Bar
1 {'street': 'Woodside Avenue'} Salza Pizza
2 {'street': 'Woodside Avenue'} Spicy Shallot
3 {'street': 'Woodhaven Boulevard'} Fresh To You
4 {'street': 'Woodhaven Boulevard'} Pio Pio
... ... ...
73 {'street': '30 Avenue'} Queens Comfort Restaurant
74 {'street': '20 Avenue'} Cafeteria (Usps Bldng)
75 {'street': '153 Avenue'} Tuscany Deli
76 {'street': '131 Street'} Spa Castle/Juice Farm
77 {'street': '102 Street'} Tacos Mexico

78 rows × 2 columns

Aggrégation¶

Cette fonction va prendre en paramètre un pipeline : tableau composé d'une suite d'opérations

Fonction Opération
$limit restriction à un petit nombre de documents (très utiles pour tester son calcul)
$sort tri sur les documents
$match restriction sur les documents à utiliser
$unwind séparation d'un document en plusieurs sur la base d'un tableau
$addFields ajout d'un champs dans les documents
$project redéfinition des documents
$group regroupements et calculs d'aggégrats
$sortByCount regroupement, calcul de dénombrement et tri déccroissant en une opération
$lookup jointure avec une autre collection
...

Syntaxe des opérations dans le pipeline¶

Les opérations se font dans l'ordre d'écriture, et le même opérateur peut donc apparaître plusieurs fois

  • $limit : un entier
  • $sort : identique à celle du paramètre sort de la fonction find()
  • $match : identique à celle du paramètre query des autres fonctions
  • $unwind : nom du tableau servant de base pour le découpage (précédé d'un $)
    • un document avec un tableau à n éléments deviendra n documents avec chacun un des éléments du tableau en lieu et place de celui-ci
  • $sortByCount : nom du champs sur lequel on veut le dénombrement et le tri décroissant selon le résultat

Syntaxe des opérations dans le pipeline¶

$project : redéfinition des documents

  • { "champs" : 1 } : conservation du champs (0 si suppression - idem que dans fields, pas de mélange sauf pour _id)
  • { "champs": { "$opérateur" : expression }} : permet de définir un nouveau champs
  • { "nouveau_champs": "$ancien_champs" } : renommage d'un champs

Quelques opérateurs utiles pour la projection (plus d'info ici)

  • $arrayElemAt : élément d'un tableau
  • $first et $last : premier ou dernier élément du tableau
  • $size : taille d'un tableau
  • $substr : sous-chaîne de caractères
  • $cond : permet de faire une condition (genre de if then else)
  • ...

Syntaxe des opérations dans le pipeline¶

$group : calcul d'agrégats

  • _id : déclaration du critère de regroupement
    • chaîne de caractères : pas de regroupement (tous les documents)
    • $champs : regroupement selon ce champs
    • { "a1": "$champs1", ... } : regroupement multiple (avec modification des valeurs possible)
  • Calculs d'agrégats à faire :
    • $sum : somme (soit de valeur fixe - 1 pour faire un décompte donc, soit d'un champs spécifique)
    • $avg, $min, $max
    • $addToSet : regroupement des valeurs distinctes d'un champs dans un tableau
    • $push : aggrégation de champs dans un tableau

Calcul d'agrégat (suite)¶

  • Limite aux 5 premiers restaurants
In [23]:
c = db.restaurants.aggregate(
    [
        {"$limit": 10 }
    ]
)
pandas.DataFrame(c)
Out[23]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068
5 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151
6 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442
7 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483
8 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649
9 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731

Calcul d'agrégat (suite)¶

  • Idem avec tri sur le nom du restaurant
In [24]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$sort": { "name": 1 }}
    ]
)
pandas.DataFrame(c)
Out[24]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151
1 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841
2 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442
3 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445
4 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649
5 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
6 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731
7 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068
8 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
9 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483

Calcul d'agrégat (suite)¶

  • Idem en se restreignant à Brooklyn
    • Notez que nous obtenons uniquement 5 restaurants au final
In [25]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$sort": { "name": 1 }},
        { "$match": { "borough": "Brooklyn" }}
    ]
)
pandas.DataFrame(c)
Out[25]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649
1 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
2 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731
3 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
4 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483

Calcul d'agrégat (suite)¶

  • Mêmes opérations mais avec la restriction en amont de la limite
    • Nous avons ici les 10 premiers restaurants de Brooklyn donc
In [26]:
c = db.restaurants.aggregate(
    [
        { "$match": { "borough": "Brooklyn" }},
        { "$limit": 10 },
        { "$sort": { "name": 1 }}
    ]
)
pandas.DataFrame(c)
Out[26]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45caa5 {'building': '7715', 'coord': [-73.9973325, 40... Brooklyn American [{'date': 2014-04-16 00:00:00, 'grade': 'A', '... C & C Catering Service 40357437
1 60006d6aa7aafd5a6d45caa9 {'building': '203', 'coord': [-73.978220400000... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-02-10 00:00:00, 'grade': 'A', '... Carvel Ice Cream 40360076
2 60006d6aa7aafd5a6d45caa6 {'building': '1269', 'coord': [-73.871194, 40.... Brooklyn Chinese [{'date': 2014-09-16 00:00:00, 'grade': 'B', '... May May Kitchen 40358429
3 60006d6aa7aafd5a6d45caab {'building': '6909', 'coord': [-74.0259567, 40... Brooklyn Delicatessen [{'date': 2014-08-21 00:00:00, 'grade': 'A', '... Nordic Delicacies 40361390
4 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649
5 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
6 60006d6aa7aafd5a6d45caa8 {'building': '705', 'coord': [-73.9653967, 40.... Brooklyn Jewish/Kosher [{'date': 2014-11-10 00:00:00, 'grade': 'A', '... Seuda Foods 40360045
7 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731
8 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
9 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483

Calcul d'agrégat (suite)¶

  • Séparation des 5 premiers restaurants sur la base des évaluations (grades)
    • Chaque ligne correspond maintenant a une évaluation pour un restaurant
In [27]:
c = db.restaurants.aggregate(
    [
        { "$limit": 5 },
        { "$unwind": "$grades" }
    ]
)
pandas.DataFrame(c)
Out[27]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2014-03-03 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2013-09-11 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
2 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2013-01-24 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
3 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2011-11-23 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
4 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2011-03-10 00:00:00, 'grade': 'B', 's... Morris Park Bake Shop 30075445
5 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2014-12-30 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
6 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2014-07-01 00:00:00, 'grade': 'B', 's... Wendy'S 30112340
7 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2013-04-30 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
8 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2012-05-08 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
9 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish {'date': 2014-09-06 00:00:00, 'grade': 'A', 's... Dj Reynolds Pub And Restaurant 30191841
10 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish {'date': 2013-07-22 00:00:00, 'grade': 'A', 's... Dj Reynolds Pub And Restaurant 30191841
11 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish {'date': 2012-07-31 00:00:00, 'grade': 'A', 's... Dj Reynolds Pub And Restaurant 30191841
12 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish {'date': 2011-12-29 00:00:00, 'grade': 'A', 's... Dj Reynolds Pub And Restaurant 30191841
13 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American {'date': 2014-06-10 00:00:00, 'grade': 'A', 's... Riviera Caterer 40356018
14 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American {'date': 2013-06-05 00:00:00, 'grade': 'A', 's... Riviera Caterer 40356018
15 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American {'date': 2012-04-13 00:00:00, 'grade': 'A', 's... Riviera Caterer 40356018
16 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American {'date': 2011-10-12 00:00:00, 'grade': 'A', 's... Riviera Caterer 40356018
17 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2014-11-24 00:00:00, 'grade': 'Z', 's... Tov Kosher Kitchen 40356068
18 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2013-01-17 00:00:00, 'grade': 'A', 's... Tov Kosher Kitchen 40356068
19 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2012-08-02 00:00:00, 'grade': 'A', 's... Tov Kosher Kitchen 40356068
20 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2011-12-15 00:00:00, 'grade': 'B', 's... Tov Kosher Kitchen 40356068

Calcul d'agrégat (suite)¶

  • Idem précédemment, en se restreignant à celle ayant eu B
In [28]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$unwind": "$grades" },
        { "$match": { "grades.grade": "B" }}
    ]
)
pandas.DataFrame(c)
Out[28]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2011-03-10 00:00:00, 'grade': 'B', 's... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2014-07-01 00:00:00, 'grade': 'B', 's... Wendy'S 30112340
2 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2011-12-15 00:00:00, 'grade': 'B', 's... Tov Kosher Kitchen 40356068

Calcul d'agrégat (suite)¶

  • Si on inverse les opérations $unwind et $match, le résultat est clairement différent
In [29]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$match": { "grades.grade": "B" }},
        { "$unwind": "$grades" }
    ]
)
pandas.DataFrame(c)
Out[29]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2014-03-03 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2013-09-11 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
2 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2013-01-24 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
3 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2011-11-23 00:00:00, 'grade': 'A', 's... Morris Park Bake Shop 30075445
4 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery {'date': 2011-03-10 00:00:00, 'grade': 'B', 's... Morris Park Bake Shop 30075445
5 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2014-12-30 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
6 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2014-07-01 00:00:00, 'grade': 'B', 's... Wendy'S 30112340
7 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2013-04-30 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
8 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers {'date': 2012-05-08 00:00:00, 'grade': 'A', 's... Wendy'S 30112340
9 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2014-11-24 00:00:00, 'grade': 'Z', 's... Tov Kosher Kitchen 40356068
10 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2013-01-17 00:00:00, 'grade': 'A', 's... Tov Kosher Kitchen 40356068
11 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2012-08-02 00:00:00, 'grade': 'A', 's... Tov Kosher Kitchen 40356068
12 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher {'date': 2011-12-15 00:00:00, 'grade': 'B', 's... Tov Kosher Kitchen 40356068

Calcul d'agrégat (suite)¶

  • On souhaite ici ne garder que le nom et le quartier des 10 premiers restaurants
    • Notez l'ordre (alphabétique) des variables, et pas celui de la déclaration
In [30]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "name": 1, "borough": 1 } }
    ]
)
pandas.DataFrame(c)
Out[30]:
_id borough name
0 60006d6aa7aafd5a6d45ca9a Bronx Morris Park Bake Shop
1 60006d6aa7aafd5a6d45ca9b Brooklyn Wendy'S
2 60006d6aa7aafd5a6d45ca9c Manhattan Dj Reynolds Pub And Restaurant
3 60006d6aa7aafd5a6d45ca9d Brooklyn Riviera Caterer
4 60006d6aa7aafd5a6d45ca9e Queens Tov Kosher Kitchen
5 60006d6aa7aafd5a6d45ca9f Queens Brunos On The Boulevard
6 60006d6aa7aafd5a6d45caa0 Staten Island Kosher Island
7 60006d6aa7aafd5a6d45caa1 Brooklyn Wilken'S Fine Food
8 60006d6aa7aafd5a6d45caa2 Brooklyn Regina Caterers
9 60006d6aa7aafd5a6d45caa3 Brooklyn Taste The Tropics Ice Cream

Calcul d'agrégat (suite)¶

  • Ici, on supprime l'adresse et les évaluations
In [31]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "address": 0, "grades": 0 } }
    ]
)
pandas.DataFrame(c)
Out[31]:
_id borough cuisine name restaurant_id
0 60006d6aa7aafd5a6d45ca9a Bronx Bakery Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9b Brooklyn Hamburgers Wendy'S 30112340
2 60006d6aa7aafd5a6d45ca9c Manhattan Irish Dj Reynolds Pub And Restaurant 30191841
3 60006d6aa7aafd5a6d45ca9d Brooklyn American Riviera Caterer 40356018
4 60006d6aa7aafd5a6d45ca9e Queens Jewish/Kosher Tov Kosher Kitchen 40356068
5 60006d6aa7aafd5a6d45ca9f Queens American Brunos On The Boulevard 40356151
6 60006d6aa7aafd5a6d45caa0 Staten Island Jewish/Kosher Kosher Island 40356442
7 60006d6aa7aafd5a6d45caa1 Brooklyn Delicatessen Wilken'S Fine Food 40356483
8 60006d6aa7aafd5a6d45caa2 Brooklyn American Regina Caterers 40356649
9 60006d6aa7aafd5a6d45caa3 Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731

Calcul d'agrégat (suite)¶

  • En plus du nom et du quartier, on récupère l'adresse mais dans un nouveau champs
In [32]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "name": 1, "borough": 1 , "street": "$address.street"} }
    ]
)
pandas.DataFrame(c)
Out[32]:
_id borough name street
0 60006d6aa7aafd5a6d45ca9a Bronx Morris Park Bake Shop Morris Park Ave
1 60006d6aa7aafd5a6d45ca9b Brooklyn Wendy'S Flatbush Avenue
2 60006d6aa7aafd5a6d45ca9c Manhattan Dj Reynolds Pub And Restaurant West 57 Street
3 60006d6aa7aafd5a6d45ca9d Brooklyn Riviera Caterer Stillwell Avenue
4 60006d6aa7aafd5a6d45ca9e Queens Tov Kosher Kitchen 63 Road
5 60006d6aa7aafd5a6d45ca9f Queens Brunos On The Boulevard Astoria Boulevard
6 60006d6aa7aafd5a6d45caa0 Staten Island Kosher Island Victory Boulevard
7 60006d6aa7aafd5a6d45caa1 Brooklyn Wilken'S Fine Food Avenue U
8 60006d6aa7aafd5a6d45caa2 Brooklyn Regina Caterers 11 Avenue
9 60006d6aa7aafd5a6d45caa3 Brooklyn Taste The Tropics Ice Cream Nostrand Avenue

Calcul d'agrégat (suite)¶

  • On ajoute le nombre de visites pour chaque restaurant (donc la taille du tableau grades)
In [33]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "name": 1, "borough": 1, "nb_grades": { "$size": "$grades" } } }
    ]
)
pandas.DataFrame(c)
Out[33]:
_id borough name nb_grades
0 60006d6aa7aafd5a6d45ca9a Bronx Morris Park Bake Shop 5
1 60006d6aa7aafd5a6d45ca9b Brooklyn Wendy'S 4
2 60006d6aa7aafd5a6d45ca9c Manhattan Dj Reynolds Pub And Restaurant 4
3 60006d6aa7aafd5a6d45ca9d Brooklyn Riviera Caterer 4
4 60006d6aa7aafd5a6d45ca9e Queens Tov Kosher Kitchen 4
5 60006d6aa7aafd5a6d45ca9f Queens Brunos On The Boulevard 4
6 60006d6aa7aafd5a6d45caa0 Staten Island Kosher Island 4
7 60006d6aa7aafd5a6d45caa1 Brooklyn Wilken'S Fine Food 6
8 60006d6aa7aafd5a6d45caa2 Brooklyn Regina Caterers 5
9 60006d6aa7aafd5a6d45caa3 Brooklyn Taste The Tropics Ice Cream 4

Calcul d'agrégat (suite)¶

  • On trie ce résultat par nombre décroissant de visites, et on affiche les 10 premiers
In [34]:
c = db.restaurants.aggregate(
    [
        { "$project": { "name": 1, "borough": 1, "nb_grades": { "$size": "$grades" } } },
        { "$sort": { "nb_grades": -1 }},
        { "$limit": 10 }
    ]
)
pandas.DataFrame(c)
Out[34]:
_id borough name nb_grades
0 60006d6ca7aafd5a6d45f30a Brooklyn Silver Krust West Indian Restaurant 9
1 60006d6ba7aafd5a6d45e7c6 Brooklyn Lai Lai Gourmet 9
2 60006d6da7aafd5a6d46011f Manhattan Pure Food 9
3 60006d6ca7aafd5a6d45f9cf Manhattan Breeze Thai-French Kitchen 9
4 60006d6ba7aafd5a6d45e35d Manhattan Benton 9
5 60006d6ca7aafd5a6d45e9fd Manhattan Nomado 33 9
6 60006d6ba7aafd5a6d45e4ce Brooklyn Noodle Station 9
7 60006d6ba7aafd5a6d45e332 Manhattan S'Mac 9
8 60006d6aa7aafd5a6d45ceeb Manhattan World Cup Cafe 8
9 60006d6aa7aafd5a6d45cf32 Brooklyn Fifth Ave Cafe /Diner 8

Calcul d'agrégat (suite)¶

  • On ne garde maintenant que le premier élément du tableau grades (indicé 0)
In [35]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "name": 1, "borough": 1, "grade": { "$arrayElemAt": [ "$grades", 0 ]} } }
    ]
)
pandas.DataFrame(c)
Out[35]:
_id borough name grade
0 60006d6aa7aafd5a6d45ca9a Bronx Morris Park Bake Shop {'date': 2014-03-03 00:00:00, 'grade': 'A', 's...
1 60006d6aa7aafd5a6d45ca9b Brooklyn Wendy'S {'date': 2014-12-30 00:00:00, 'grade': 'A', 's...
2 60006d6aa7aafd5a6d45ca9c Manhattan Dj Reynolds Pub And Restaurant {'date': 2014-09-06 00:00:00, 'grade': 'A', 's...
3 60006d6aa7aafd5a6d45ca9d Brooklyn Riviera Caterer {'date': 2014-06-10 00:00:00, 'grade': 'A', 's...
4 60006d6aa7aafd5a6d45ca9e Queens Tov Kosher Kitchen {'date': 2014-11-24 00:00:00, 'grade': 'Z', 's...
5 60006d6aa7aafd5a6d45ca9f Queens Brunos On The Boulevard {'date': 2014-11-15 00:00:00, 'grade': 'Z', 's...
6 60006d6aa7aafd5a6d45caa0 Staten Island Kosher Island {'date': 2014-10-06 00:00:00, 'grade': 'A', 's...
7 60006d6aa7aafd5a6d45caa1 Brooklyn Wilken'S Fine Food {'date': 2014-05-29 00:00:00, 'grade': 'A', 's...
8 60006d6aa7aafd5a6d45caa2 Brooklyn Regina Caterers {'date': 2014-07-18 00:00:00, 'grade': 'A', 's...
9 60006d6aa7aafd5a6d45caa3 Brooklyn Taste The Tropics Ice Cream {'date': 2014-07-14 00:00:00, 'grade': 'A', 's...

Calcul d'agrégat (suite)¶

  • $first permet aussi de garder uniquement le premier élément du tableau grades de façon explicite ($last pour le dernier)
In [36]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "name": 1, "borough": 1, "grade": { "$first": "$grades" } } }
    ]
)
pandas.DataFrame(c)
Out[36]:
_id borough name grade
0 60006d6aa7aafd5a6d45ca9a Bronx Morris Park Bake Shop {'date': 2014-03-03 00:00:00, 'grade': 'A', 's...
1 60006d6aa7aafd5a6d45ca9b Brooklyn Wendy'S {'date': 2014-12-30 00:00:00, 'grade': 'A', 's...
2 60006d6aa7aafd5a6d45ca9c Manhattan Dj Reynolds Pub And Restaurant {'date': 2014-09-06 00:00:00, 'grade': 'A', 's...
3 60006d6aa7aafd5a6d45ca9d Brooklyn Riviera Caterer {'date': 2014-06-10 00:00:00, 'grade': 'A', 's...
4 60006d6aa7aafd5a6d45ca9e Queens Tov Kosher Kitchen {'date': 2014-11-24 00:00:00, 'grade': 'Z', 's...
5 60006d6aa7aafd5a6d45ca9f Queens Brunos On The Boulevard {'date': 2014-11-15 00:00:00, 'grade': 'Z', 's...
6 60006d6aa7aafd5a6d45caa0 Staten Island Kosher Island {'date': 2014-10-06 00:00:00, 'grade': 'A', 's...
7 60006d6aa7aafd5a6d45caa1 Brooklyn Wilken'S Fine Food {'date': 2014-05-29 00:00:00, 'grade': 'A', 's...
8 60006d6aa7aafd5a6d45caa2 Brooklyn Regina Caterers {'date': 2014-07-18 00:00:00, 'grade': 'A', 's...
9 60006d6aa7aafd5a6d45caa3 Brooklyn Taste The Tropics Ice Cream {'date': 2014-07-14 00:00:00, 'grade': 'A', 's...

Calcul d'agrégat (suite)¶

  • On peut aussi faire des opérations sur les chaînes, tel que la mise en majuscule du nom
In [37]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { "nom": { "$toUpper": "$name" }, "borough": 1 } }
    ]
)
pandas.DataFrame(c)
Out[37]:
_id borough nom
0 60006d6aa7aafd5a6d45ca9a Bronx MORRIS PARK BAKE SHOP
1 60006d6aa7aafd5a6d45ca9b Brooklyn WENDY'S
2 60006d6aa7aafd5a6d45ca9c Manhattan DJ REYNOLDS PUB AND RESTAURANT
3 60006d6aa7aafd5a6d45ca9d Brooklyn RIVIERA CATERER
4 60006d6aa7aafd5a6d45ca9e Queens TOV KOSHER KITCHEN
5 60006d6aa7aafd5a6d45ca9f Queens BRUNOS ON THE BOULEVARD
6 60006d6aa7aafd5a6d45caa0 Staten Island KOSHER ISLAND
7 60006d6aa7aafd5a6d45caa1 Brooklyn WILKEN'S FINE FOOD
8 60006d6aa7aafd5a6d45caa2 Brooklyn REGINA CATERERS
9 60006d6aa7aafd5a6d45caa3 Brooklyn TASTE THE TROPICS ICE CREAM

Calcul d'agrégat (suite)¶

  • On peut aussi vouloir ajouter un champs, comme ici le nombre d'évaluations
In [38]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$addFields": { "nb_grades": { "$size": "$grades" } } }
    ]
)
pandas.DataFrame(c)
Out[38]:
_id address borough cuisine grades name restaurant_id nb_grades
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445 5
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340 4
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841 4
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018 4
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068 4
5 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151 4
6 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442 4
7 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483 6
8 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649 5
9 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731 4

Calcul d'agrégat (suite)¶

  • On extrait ici les trois premières lettres du quartier
In [39]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$project": { 
            "nom": { "$toUpper": "$name" }, 
            "quartier": { "$substr": [ "$borough", 0, 3 ] } 
        } }
    ]
)
pandas.DataFrame(c)
Out[39]:
_id nom quartier
0 60006d6aa7aafd5a6d45ca9a MORRIS PARK BAKE SHOP Bro
1 60006d6aa7aafd5a6d45ca9b WENDY'S Bro
2 60006d6aa7aafd5a6d45ca9c DJ REYNOLDS PUB AND RESTAURANT Man
3 60006d6aa7aafd5a6d45ca9d RIVIERA CATERER Bro
4 60006d6aa7aafd5a6d45ca9e TOV KOSHER KITCHEN Que
5 60006d6aa7aafd5a6d45ca9f BRUNOS ON THE BOULEVARD Que
6 60006d6aa7aafd5a6d45caa0 KOSHER ISLAND Sta
7 60006d6aa7aafd5a6d45caa1 WILKEN'S FINE FOOD Bro
8 60006d6aa7aafd5a6d45caa2 REGINA CATERERS Bro
9 60006d6aa7aafd5a6d45caa3 TASTE THE TROPICS ICE CREAM Bro

Calcul d'agrégat (suite)¶

  • On fait de même, mais on met en majuscule et on note BRX pour le Bronx
    • on garde le quartier d'origine pour vérification ici
In [40]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$addFields": { "quartier": { "$toUpper": { "$substr": [ "$borough", 0, 3 ] } } }},
        { "$project": { 
            "nom": { "$toUpper": "$name" }, 
            "quartier": { "$cond": { 
                "if": { "$eq": ["$borough", "Bronx"] }, 
                "then": "BRX", 
                "else": "$quartier" 
            } },
            "borough": 1
        } }
    ]
)
pandas.DataFrame(c)
Out[40]:
_id borough nom quartier
0 60006d6aa7aafd5a6d45ca9a Bronx MORRIS PARK BAKE SHOP BRX
1 60006d6aa7aafd5a6d45ca9b Brooklyn WENDY'S BRO
2 60006d6aa7aafd5a6d45ca9c Manhattan DJ REYNOLDS PUB AND RESTAURANT MAN
3 60006d6aa7aafd5a6d45ca9d Brooklyn RIVIERA CATERER BRO
4 60006d6aa7aafd5a6d45ca9e Queens TOV KOSHER KITCHEN QUE
5 60006d6aa7aafd5a6d45ca9f Queens BRUNOS ON THE BOULEVARD QUE
6 60006d6aa7aafd5a6d45caa0 Staten Island KOSHER ISLAND STA
7 60006d6aa7aafd5a6d45caa1 Brooklyn WILKEN'S FINE FOOD BRO
8 60006d6aa7aafd5a6d45caa2 Brooklyn REGINA CATERERS BRO
9 60006d6aa7aafd5a6d45caa3 Brooklyn TASTE THE TROPICS ICE CREAM BRO

Calcul d'agrégat (suite)¶

  • On calcule ici le nombre total de restaurants
In [41]:
c = db.restaurants.aggregate(
    [
        {"$group": {"_id": "Total", "NbRestos": {"$sum": 1}}}
    ]
)
pandas.DataFrame(c)
Out[41]:
_id NbRestos
0 Total 25359

Calcul d'agrégat (suite)¶

  • On fait de même, mais par quartier
In [42]:
c = db.restaurants.aggregate(
    [
        {"$group": {"_id": "$borough", "NbRestos": {"$sum": 1}}}
    ]
)
pandas.DataFrame(c)
Out[42]:
_id NbRestos
0 Manhattan 10259
1 Queens 5656
2 Staten Island 969
3 Bronx 2338
4 Missing 51
5 Brooklyn 6086

Calcul d'agrégat (suite)¶

  • Une fois le dénombrement fait, on peut aussi trié le résultat
In [43]:
c = db.restaurants.aggregate(
    [
        {"$group": {"_id": "$borough", "NbRestos": {"$sum": 1}}},
        {"$sort": { "NbRestos": -1}}
    ]
)
pandas.DataFrame(c)
Out[43]:
_id NbRestos
0 Manhattan 10259
1 Brooklyn 6086
2 Queens 5656
3 Bronx 2338
4 Staten Island 969
5 Missing 51

Calcul d'agrégat (suite)¶

  • La même opération est réalisable directement avec $sortByCount
In [44]:
c = db.restaurants.aggregate(
    [
        {"$sortByCount": "$borough"}
    ]
)
pandas.DataFrame(c)
Out[44]:
_id count
0 Manhattan 10259
1 Brooklyn 6086
2 Queens 5656
3 Bronx 2338
4 Staten Island 969
5 Missing 51

Calcul d'agrégat (suite)¶

  • Pour faire le calcul des notes moyennes des restaurants du Queens, on exécute le code suivant
In [45]:
c = db.restaurants.aggregate(
    [
        { "$match": { "borough": "Queens" }},
        { "$unwind": "$grades" },
        { "$group": { "_id": "null", "score": { "$avg": "$grades.score" }}}
    ]
)
pandas.DataFrame(c)
Out[45]:
_id score
0 null 11.634865

Calcul d'agrégat (suite)¶

  • Il est bien évidemment possible de faire ce calcul par quartier et de les trier selon les notes obtenues (dans l'ordre décroissant)
In [46]:
c = db.restaurants.aggregate(
    [
        { "$unwind": "$grades" },
        { "$group": { "_id": "$borough", "score": { "$avg": "$grades.score" }}},
        { "$sort": { "score": -1 }}
    ]
)
pandas.DataFrame(c)
Out[46]:
_id score
0 Queens 11.634865
1 Brooklyn 11.447976
2 Manhattan 11.418151
3 Staten Island 11.370958
4 Bronx 11.036186
5 Missing 9.632911

Calcul d'agrégat (suite)¶

  • On peut aussi faire un regroupement par quartier et par rue (en ne prenant que la première évaluation - qui est la dernière en date a priori), pour afficher les 10 rues où on mange le plus sainement
    • Notez que le $match permet de supprimer les restaurants sans évaluations (ce qui engendrerait des moyennes = None)
In [47]:
c = db.restaurants.aggregate(
    [
        { "$project": {
            "borough": 1, "street": "$address.street", 
            "eval": { "$arrayElemAt": [ "$grades", 0 ]} 
        } },
        { "$match": { "eval": { "$exists": True } } },
        { "$group": { 
            "_id": { "quartier": "$borough", "rue": "$street" }, 
            "score": { "$avg": "$eval.score" }
        }},
        { "$sort": { "score": 1 }},
        { "$limit": 10 }
    ]
)
pandas.DataFrame(c)
Out[47]:
_id score
0 {'quartier': 'Manhattan', 'rue': '106 Street &... -1.0
1 {'quartier': 'Brooklyn', 'rue': 'Shore Pkwy So... 0.0
2 {'quartier': 'Manhattan', 'rue': 'Oliver St'} 0.0
3 {'quartier': 'Brooklyn', 'rue': '78Th St'} 0.0
4 {'quartier': 'Brooklyn', 'rue': 'Stockholm St'} 0.0
5 {'quartier': 'Manhattan', 'rue': 'West 123 St... 0.0
6 {'quartier': 'Queens', 'rue': '100Th St'} 0.0
7 {'quartier': 'Manhattan', 'rue': 'River Terrace'} 0.0
8 {'quartier': 'Queens', 'rue': '95Th St'} 0.0
9 {'quartier': 'Manhattan', 'rue': 'Pleasant Ave... 0.0

Calcul d'agrégat (suite)¶

  • Pour comprendre la différence entre $addToSet et $push, on les applique sur les grades obtenus pour les 10 premiers restaurants
    • $addToSet : valeurs distinctes
    • $push : toutes les valeurs présentes
In [48]:
c = db.restaurants.aggregate(
    [
        { "$limit": 10 },
        { "$unwind": "$grades" },
        { "$group": { 
            "_id": "$name", 
            "avec_addToSet": { "$addToSet": "$grades.grade" },
            "avec_push": { "$push": "$grades.grade" }
        }}
    ]
)
pandas.DataFrame(c)
Out[48]:
_id avec_addToSet avec_push
0 Tov Kosher Kitchen [B, Z, A] [Z, A, A, B]
1 Riviera Caterer [A] [A, A, A, A]
2 Kosher Island [A] [A, A, A, A]
3 Wendy'S [B, A] [A, B, A, A]
4 Morris Park Bake Shop [B, A] [A, A, A, A, B]
5 Wilken'S Fine Food [A] [A, A, A, A, A, A]
6 Regina Caterers [A] [A, A, A, A, A]
7 Dj Reynolds Pub And Restaurant [A] [A, A, A, A]
8 Brunos On The Boulevard [Z, A] [Z, A, A, A]
9 Taste The Tropics Ice Cream [A] [A, A, A, A]

Itération¶

Il est possible de définir un curseur qui va itérer sur la liste de résultats (celle-ci sera stocké sur le serveur). Cela permet de récupérer les documents par paquets, ce qui est judicieux en cas de gros volume (pour éviter de congestionner un réseau par exemple).

In [49]:
cursor = db.restaurants.find(
    {"borough": "Queens", "grades.score": { "$gte":  50}},
    {"_id": 0, "name": 1, "address.street": 1},
    batch_size = 10)

Mais l'opération est totalement transparente dans python, puisque lorsque nous appelons le curseur, nous récupérons tous les documents.

In [50]:
pandas.DataFrame(cursor)
Out[50]:
address name
0 {'street': 'Horace Harding Boulevard'} Richer'S Bakery
1 {'street': 'Bell Boulevard'} Tequilla Sunrise
2 {'street': 'Rockaway Beach Boulevard'} Rockaway Beach Inn
3 {'street': 'Broadway'} Alfonso'S Bar
4 {'street': 'Woodhaven Boulevard'} Pio Pio
... ... ...
78 {'street': '30 Avenue'} Queens Comfort Restaurant
79 {'street': 'Union Turnpike'} Koyla
80 {'street': '37 Road'} Jackson Heights Food Court
81 {'street': 'Union Street'} K & D Internet Inc
82 {'street': 'Roosevelt Ave'} Tacos Al Suadero

83 rows × 2 columns

Gestion des variables spéciales dans le DataFrame¶

Une fois importées dans un DataFrame, les champs complexes (comme address et grades) sont des variables d'un type un peu particulier.

In [52]:
df = pandas.DataFrame(db.restaurants.find(limit = 10))
df
Out[52]:
_id address borough cuisine grades name restaurant_id
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068
5 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151
6 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442
7 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483
8 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649
9 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731

Variables ayant des dictionnaires comme valeurs¶

Le champs address est une liste de dictionnaires, ayant chacun plusieurs champs (ici tous les mêmes).

In [53]:
df.address
Out[53]:
0    {'building': '1007', 'coord': [-73.856077, 40....
1    {'building': '469', 'coord': [-73.961704, 40.6...
2    {'building': '351', 'coord': [-73.985135599999...
3    {'building': '2780', 'coord': [-73.98241999999...
4    {'building': '97-22', 'coord': [-73.8601152, 4...
5    {'building': '8825', 'coord': [-73.8803827, 40...
6    {'building': '2206', 'coord': [-74.1377286, 40...
7    {'building': '7114', 'coord': [-73.9068506, 40...
8    {'building': '6409', 'coord': [-74.00528899999...
9    {'building': '1839', 'coord': [-73.9482609, 40...
Name: address, dtype: object

Manipulation simple¶

  • Nom du bâtiment et rue concaténés dans une nouvelle variable de df
    • utilisation de list comprehension
In [54]:
df.assign(info = [e["building"] + ", " + e["street"] for e in df.address])
Out[54]:
_id address borough cuisine grades name restaurant_id info
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445 1007, Morris Park Ave
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340 469, Flatbush Avenue
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841 351, West 57 Street
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018 2780, Stillwell Avenue
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068 97-22, 63 Road
5 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151 8825, Astoria Boulevard
6 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442 2206, Victory Boulevard
7 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483 7114, Avenue U
8 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649 6409, 11 Avenue
9 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731 1839, Nostrand Avenue

Manipulation plus complexe¶

  • Transformation de la liste en un DataFrame
In [55]:
pandas.DataFrame([e for e in df.address])
Out[55]:
building coord street zipcode
0 1007 [-73.856077, 40.848447] Morris Park Ave 10462
1 469 [-73.961704, 40.662942] Flatbush Avenue 11225
2 351 [-73.98513559999999, 40.7676919] West 57 Street 10019
3 2780 [-73.98241999999999, 40.579505] Stillwell Avenue 11224
4 97-22 [-73.8601152, 40.7311739] 63 Road 11374
5 8825 [-73.8803827, 40.7643124] Astoria Boulevard 11369
6 2206 [-74.1377286, 40.6119572] Victory Boulevard 10314
7 7114 [-73.9068506, 40.6199034] Avenue U 11234
8 6409 [-74.00528899999999, 40.628886] 11 Avenue 11219
9 1839 [-73.9482609, 40.6408271] Nostrand Avenue 11226

Idem en intégrant le résultat dans le DataFrame original¶

In [56]:
pandas.concat([df.drop("address", axis = 1), pandas.DataFrame([e for e in df.address])], axis = 1)
Out[56]:
_id borough cuisine grades name restaurant_id building coord street zipcode
0 60006d6aa7aafd5a6d45ca9a Bronx Bakery [{'date': 2014-03-03 00:00:00, 'grade': 'A', '... Morris Park Bake Shop 30075445 1007 [-73.856077, 40.848447] Morris Park Ave 10462
1 60006d6aa7aafd5a6d45ca9b Brooklyn Hamburgers [{'date': 2014-12-30 00:00:00, 'grade': 'A', '... Wendy'S 30112340 469 [-73.961704, 40.662942] Flatbush Avenue 11225
2 60006d6aa7aafd5a6d45ca9c Manhattan Irish [{'date': 2014-09-06 00:00:00, 'grade': 'A', '... Dj Reynolds Pub And Restaurant 30191841 351 [-73.98513559999999, 40.7676919] West 57 Street 10019
3 60006d6aa7aafd5a6d45ca9d Brooklyn American [{'date': 2014-06-10 00:00:00, 'grade': 'A', '... Riviera Caterer 40356018 2780 [-73.98241999999999, 40.579505] Stillwell Avenue 11224
4 60006d6aa7aafd5a6d45ca9e Queens Jewish/Kosher [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '... Tov Kosher Kitchen 40356068 97-22 [-73.8601152, 40.7311739] 63 Road 11374
5 60006d6aa7aafd5a6d45ca9f Queens American [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '... Brunos On The Boulevard 40356151 8825 [-73.8803827, 40.7643124] Astoria Boulevard 11369
6 60006d6aa7aafd5a6d45caa0 Staten Island Jewish/Kosher [{'date': 2014-10-06 00:00:00, 'grade': 'A', '... Kosher Island 40356442 2206 [-74.1377286, 40.6119572] Victory Boulevard 10314
7 60006d6aa7aafd5a6d45caa1 Brooklyn Delicatessen [{'date': 2014-05-29 00:00:00, 'grade': 'A', '... Wilken'S Fine Food 40356483 7114 [-73.9068506, 40.6199034] Avenue U 11234
8 60006d6aa7aafd5a6d45caa2 Brooklyn American [{'date': 2014-07-18 00:00:00, 'grade': 'A', '... Regina Caterers 40356649 6409 [-74.00528899999999, 40.628886] 11 Avenue 11219
9 60006d6aa7aafd5a6d45caa3 Brooklyn Ice Cream, Gelato, Yogurt, Ices [{'date': 2014-07-14 00:00:00, 'grade': 'A', '... Taste The Tropics Ice Cream 40356731 1839 [-73.9482609, 40.6408271] Nostrand Avenue 11226

Variables ayant des tableaux comme valeurs¶

Le champs grades est une liste de tableaux, ayant chacun potentiellement plusieurs valeurs (des dictionnaires de plus)

In [57]:
df.grades
Out[57]:
0    [{'date': 2014-03-03 00:00:00, 'grade': 'A', '...
1    [{'date': 2014-12-30 00:00:00, 'grade': 'A', '...
2    [{'date': 2014-09-06 00:00:00, 'grade': 'A', '...
3    [{'date': 2014-06-10 00:00:00, 'grade': 'A', '...
4    [{'date': 2014-11-24 00:00:00, 'grade': 'Z', '...
5    [{'date': 2014-11-15 00:00:00, 'grade': 'Z', '...
6    [{'date': 2014-10-06 00:00:00, 'grade': 'A', '...
7    [{'date': 2014-05-29 00:00:00, 'grade': 'A', '...
8    [{'date': 2014-07-18 00:00:00, 'grade': 'A', '...
9    [{'date': 2014-07-14 00:00:00, 'grade': 'A', '...
Name: grades, dtype: object

Manipulation simple¶

  • Récupération d'un élément du tableau (premier ou dernier)
In [58]:
df.assign(derniere = [e[0] for e in df.grades], premiere = [e[-1] for e in df.grades]).drop("grades", axis = 1)
Out[58]:
_id address borough cuisine name restaurant_id derniere premiere
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 {'date': 2014-03-03 00:00:00, 'grade': 'A', 's... {'date': 2011-03-10 00:00:00, 'grade': 'B', 's...
1 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers Wendy'S 30112340 {'date': 2014-12-30 00:00:00, 'grade': 'A', 's... {'date': 2012-05-08 00:00:00, 'grade': 'A', 's...
2 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 {'date': 2014-09-06 00:00:00, 'grade': 'A', 's... {'date': 2011-12-29 00:00:00, 'grade': 'A', 's...
3 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American Riviera Caterer 40356018 {'date': 2014-06-10 00:00:00, 'grade': 'A', 's... {'date': 2011-10-12 00:00:00, 'grade': 'A', 's...
4 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher Tov Kosher Kitchen 40356068 {'date': 2014-11-24 00:00:00, 'grade': 'Z', 's... {'date': 2011-12-15 00:00:00, 'grade': 'B', 's...
5 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American Brunos On The Boulevard 40356151 {'date': 2014-11-15 00:00:00, 'grade': 'Z', 's... {'date': 2012-02-10 00:00:00, 'grade': 'A', 's...
6 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher Kosher Island 40356442 {'date': 2014-10-06 00:00:00, 'grade': 'A', 's... {'date': 2012-01-24 00:00:00, 'grade': 'A', 's...
7 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 {'date': 2014-05-29 00:00:00, 'grade': 'A', 's... {'date': 2011-10-14 00:00:00, 'grade': 'A', 's...
8 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 {'date': 2014-07-18 00:00:00, 'grade': 'A', 's... {'date': 2011-08-17 00:00:00, 'grade': 'A', 's...
9 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 {'date': 2014-07-14 00:00:00, 'grade': 'A', 's... {'date': 2012-02-23 00:00:00, 'grade': 'A', 's...

Manipulation plus complexe¶

  • Transformation de la liste de tableaux en un seul DataFrame
    • zip() permet d'itérer sur plusieurs tableaux en même temps
    • concat() permet de concaténer les tableaux entre eux
In [59]:
dfgrades = pandas.concat([pandas.DataFrame(g).assign(_id = i) for (i, g) in zip(df._id, df.grades)])
dfgrades
Out[59]:
date grade score _id
0 2014-03-03 A 2 60006d6aa7aafd5a6d45ca9a
1 2013-09-11 A 6 60006d6aa7aafd5a6d45ca9a
2 2013-01-24 A 10 60006d6aa7aafd5a6d45ca9a
3 2011-11-23 A 9 60006d6aa7aafd5a6d45ca9a
4 2011-03-10 B 14 60006d6aa7aafd5a6d45ca9a
0 2014-12-30 A 8 60006d6aa7aafd5a6d45ca9b
1 2014-07-01 B 23 60006d6aa7aafd5a6d45ca9b
2 2013-04-30 A 12 60006d6aa7aafd5a6d45ca9b
3 2012-05-08 A 12 60006d6aa7aafd5a6d45ca9b
0 2014-09-06 A 2 60006d6aa7aafd5a6d45ca9c
1 2013-07-22 A 11 60006d6aa7aafd5a6d45ca9c
2 2012-07-31 A 12 60006d6aa7aafd5a6d45ca9c
3 2011-12-29 A 12 60006d6aa7aafd5a6d45ca9c
0 2014-06-10 A 5 60006d6aa7aafd5a6d45ca9d
1 2013-06-05 A 7 60006d6aa7aafd5a6d45ca9d
2 2012-04-13 A 12 60006d6aa7aafd5a6d45ca9d
3 2011-10-12 A 12 60006d6aa7aafd5a6d45ca9d
0 2014-11-24 Z 20 60006d6aa7aafd5a6d45ca9e
1 2013-01-17 A 13 60006d6aa7aafd5a6d45ca9e
2 2012-08-02 A 13 60006d6aa7aafd5a6d45ca9e
3 2011-12-15 B 25 60006d6aa7aafd5a6d45ca9e
0 2014-11-15 Z 38 60006d6aa7aafd5a6d45ca9f
1 2014-05-02 A 10 60006d6aa7aafd5a6d45ca9f
2 2013-03-02 A 7 60006d6aa7aafd5a6d45ca9f
3 2012-02-10 A 13 60006d6aa7aafd5a6d45ca9f
0 2014-10-06 A 9 60006d6aa7aafd5a6d45caa0
1 2014-05-20 A 12 60006d6aa7aafd5a6d45caa0
2 2013-04-04 A 12 60006d6aa7aafd5a6d45caa0
3 2012-01-24 A 9 60006d6aa7aafd5a6d45caa0
0 2014-05-29 A 10 60006d6aa7aafd5a6d45caa1
1 2014-01-14 A 10 60006d6aa7aafd5a6d45caa1
2 2013-08-03 A 8 60006d6aa7aafd5a6d45caa1
3 2012-07-18 A 10 60006d6aa7aafd5a6d45caa1
4 2012-03-09 A 13 60006d6aa7aafd5a6d45caa1
5 2011-10-14 A 9 60006d6aa7aafd5a6d45caa1
0 2014-07-18 A 12 60006d6aa7aafd5a6d45caa2
1 2013-07-30 A 12 60006d6aa7aafd5a6d45caa2
2 2013-02-13 A 11 60006d6aa7aafd5a6d45caa2
3 2012-08-16 A 2 60006d6aa7aafd5a6d45caa2
4 2011-08-17 A 11 60006d6aa7aafd5a6d45caa2
0 2014-07-14 A 12 60006d6aa7aafd5a6d45caa3
1 2013-07-10 A 8 60006d6aa7aafd5a6d45caa3
2 2012-07-11 A 5 60006d6aa7aafd5a6d45caa3
3 2012-02-23 A 8 60006d6aa7aafd5a6d45caa3

Combinaison avec les données originales¶

  • Jointure entre les deux DataFrames avec merge()
In [60]:
pandas.merge(df.drop("grades", axis = 1), dfgrades.reset_index())
Out[60]:
_id address borough cuisine name restaurant_id index date grade score
0 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 0 2014-03-03 A 2
1 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 1 2013-09-11 A 6
2 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 2 2013-01-24 A 10
3 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 3 2011-11-23 A 9
4 60006d6aa7aafd5a6d45ca9a {'building': '1007', 'coord': [-73.856077, 40.... Bronx Bakery Morris Park Bake Shop 30075445 4 2011-03-10 B 14
5 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers Wendy'S 30112340 0 2014-12-30 A 8
6 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers Wendy'S 30112340 1 2014-07-01 B 23
7 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers Wendy'S 30112340 2 2013-04-30 A 12
8 60006d6aa7aafd5a6d45ca9b {'building': '469', 'coord': [-73.961704, 40.6... Brooklyn Hamburgers Wendy'S 30112340 3 2012-05-08 A 12
9 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 0 2014-09-06 A 2
10 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 1 2013-07-22 A 11
11 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 2 2012-07-31 A 12
12 60006d6aa7aafd5a6d45ca9c {'building': '351', 'coord': [-73.985135599999... Manhattan Irish Dj Reynolds Pub And Restaurant 30191841 3 2011-12-29 A 12
13 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American Riviera Caterer 40356018 0 2014-06-10 A 5
14 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American Riviera Caterer 40356018 1 2013-06-05 A 7
15 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American Riviera Caterer 40356018 2 2012-04-13 A 12
16 60006d6aa7aafd5a6d45ca9d {'building': '2780', 'coord': [-73.98241999999... Brooklyn American Riviera Caterer 40356018 3 2011-10-12 A 12
17 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher Tov Kosher Kitchen 40356068 0 2014-11-24 Z 20
18 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher Tov Kosher Kitchen 40356068 1 2013-01-17 A 13
19 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher Tov Kosher Kitchen 40356068 2 2012-08-02 A 13
20 60006d6aa7aafd5a6d45ca9e {'building': '97-22', 'coord': [-73.8601152, 4... Queens Jewish/Kosher Tov Kosher Kitchen 40356068 3 2011-12-15 B 25
21 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American Brunos On The Boulevard 40356151 0 2014-11-15 Z 38
22 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American Brunos On The Boulevard 40356151 1 2014-05-02 A 10
23 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American Brunos On The Boulevard 40356151 2 2013-03-02 A 7
24 60006d6aa7aafd5a6d45ca9f {'building': '8825', 'coord': [-73.8803827, 40... Queens American Brunos On The Boulevard 40356151 3 2012-02-10 A 13
25 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher Kosher Island 40356442 0 2014-10-06 A 9
26 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher Kosher Island 40356442 1 2014-05-20 A 12
27 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher Kosher Island 40356442 2 2013-04-04 A 12
28 60006d6aa7aafd5a6d45caa0 {'building': '2206', 'coord': [-74.1377286, 40... Staten Island Jewish/Kosher Kosher Island 40356442 3 2012-01-24 A 9
29 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 0 2014-05-29 A 10
30 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 1 2014-01-14 A 10
31 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 2 2013-08-03 A 8
32 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 3 2012-07-18 A 10
33 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 4 2012-03-09 A 13
34 60006d6aa7aafd5a6d45caa1 {'building': '7114', 'coord': [-73.9068506, 40... Brooklyn Delicatessen Wilken'S Fine Food 40356483 5 2011-10-14 A 9
35 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 0 2014-07-18 A 12
36 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 1 2013-07-30 A 12
37 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 2 2013-02-13 A 11
38 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 3 2012-08-16 A 2
39 60006d6aa7aafd5a6d45caa2 {'building': '6409', 'coord': [-74.00528899999... Brooklyn American Regina Caterers 40356649 4 2011-08-17 A 11
40 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 0 2014-07-14 A 12
41 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 1 2013-07-10 A 8
42 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 2 2012-07-11 A 5
43 60006d6aa7aafd5a6d45caa3 {'building': '1839', 'coord': [-73.9482609, 40... Brooklyn Ice Cream, Gelato, Yogurt, Ices Taste The Tropics Ice Cream 40356731 3 2012-02-23 A 8