diff --git a/ConnectorES.ipynb b/ConnectorES.ipynb
index a5244829c683d7c2b98c2052d1309790d1f90e79..e155e7dc17d4601d496803a9a93e79c037ccd44d 100644
--- a/ConnectorES.ipynb
+++ b/ConnectorES.ipynb
@@ -1015,11 +1015,45 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 66,
    "id": "35e308b8",
    "metadata": {},
-   "outputs": [],
-   "source": []
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_453872/2817808240.py:3: DeprecationWarning: The 'body' parameter is deprecated and will be removed in a future version. Instead use individual parameters.\n",
+      "  client.search(index='tweets',\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "ObjectApiResponse({'took': 0, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 4875, 'relation': 'eq'}, 'max_score': None, 'hits': [{'_index': 'tweets', '_id': '1615995289839538176', '_score': None, '_source': {'userId': 962990947, '_doc': '\"Mince, j\\'ai perdu le train\". En pleine grève, elle rate son train pendant qu\\'elle répond en direct à BFMTV 🚆😅 https://t.co/TObulhi7v0', 'date': '2023-01-19T08:51:15+00:00', 'location': 'Paris', 'coordinates': None, 'place': None, 'like': 49901, 'followersCount': 542}, 'sort': [49901]}, {'_index': 'tweets', '_id': '1616679739980128257', '_score': None, '_ignored': ['_doc.keyword'], '_source': {'userId': 801822323825410049, '_doc': '\"Si tu vires Bolloré, Arnault, on est mort !\" \\nPourtant c\\'est Mouloud et ses collègues caristes qui chargeaient les camions de papier toilette en plein Covid. \\n \\nDepuis, Bolloré a gagné 4 milliards sans rien faire.  \\nMouloud ? 4% d\\'augmentation de son SMIC après un mois de grève.', 'date': '2023-01-21T06:11:01+00:00', 'location': 'Amiens, France', 'coordinates': None, 'place': None, 'like': 7783, 'followersCount': 371234}, 'sort': [7783]}, {'_index': 'tweets', '_id': '1617517060841668608', '_score': None, '_ignored': ['_doc.keyword'], '_source': {'userId': 474073938, '_doc': 'Les éditorialistes de BFM, du Monde, du Figaro, de RTL, de France TV, de France Inter et des Échos sont invités à déjeuner à l’Elysée par Macron avant la grève contre la réforme des retraites pour noter les éléments de langages\\n\\nDevinez qui l’Elysée accuse de propagande ? https://t.co/1yEyKBKpyl', 'date': '2023-01-23T13:38:13+00:00', 'location': 'Paris, France', 'coordinates': None, 'place': None, 'like': 6836, 'followersCount': 195911}, 'sort': [6836]}]}})"
+      ]
+     },
+     "execution_count": 66,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "# Réchauffons-nous en complétant les todos\n",
+    "client.search(index='TODO',\n",
+    "              body={\n",
+    "                    \"query\" : {\n",
+    "                                \"match_all\" : {}\n",
+    "                               },\n",
+    "                    \"sort\": [{\n",
+    "                        \"TODO\": {\n",
+    "                                \"order\": \"TODO\"\n",
+    "                                }\n",
+    "                            }],\n",
+    "                     \"size\": TODO\n",
+    "                })       \n",
+    "            "
+   ]
   },
   {
    "attachments": {},
@@ -1032,11 +1066,33 @@
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 67,
    "id": "14fbed1f",
    "metadata": {},
-   "outputs": [],
-   "source": []
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_453872/2699639755.py:1: DeprecationWarning: The 'body' parameter is deprecated and will be removed in a future version. Instead use individual parameters.\n",
+      "  client.search(index='tweets',\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "ObjectApiResponse({'took': 0, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 4875, 'relation': 'eq'}, 'max_score': None, 'hits': [{'_index': 'tweets', '_id': '1618363847504535562', '_score': None, '_source': {'userId': 24744541, '_doc': '« Les factures s’envolent, et avec ce genre de salaire, Amazon nous pousse vers le seuil de pauvreté » : première grève de l’histoire d’Amazon au Royaume-Uni, à l’entrepôt de Coventry | par @IciLondres lemonde.fr/economie/artic…', 'date': '2023-01-25T21:43:03+00:00', 'location': 'Paris', 'coordinates': None, 'place': None, 'like': 33, 'followersCount': 10561323}, 'sort': [10561323]}, {'_index': 'tweets', '_id': '1618226895828525056', '_score': None, '_source': {'userId': 24744541, '_doc': 'Une grève du personnel à l’aéroport de Berlin provoque l’annulation des vols de 35 000 passagers lemonde.fr/international/…', 'date': '2023-01-25T12:38:51+00:00', 'location': 'Paris', 'coordinates': None, 'place': None, 'like': 27, 'followersCount': 10561323}, 'sort': [10561323]}, {'_index': 'tweets', '_id': '1617936536774770721', '_score': None, '_source': {'userId': 24744541, '_doc': '#Retraites | La CGT-Cheminots et SUD-Rail envisagent une grève reconductible à la SNCF « dès la mi-février » lemonde.fr/politique/arti…', 'date': '2023-01-24T17:25:04+00:00', 'location': 'Paris', 'coordinates': None, 'place': None, 'like': 17, 'followersCount': 10561323}, 'sort': [10561323]}]}})"
+      ]
+     },
+     "execution_count": 67,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "client.search(index='TODO',\n",
+    "              body={TODO})    "
+   ]
   },
   {
    "attachments": {},
@@ -1044,16 +1100,54 @@
    "id": "03b1813d",
    "metadata": {},
    "source": [
-    "#### Q3 : Trouver les tweets postés par les influenceurs/euses (follower > 10000)"
+    "#### Q3 : Calculer le nombre de twitteurs (les personnes qui ont publié du tweet) par ville (utiliser aggregation & term)"
    ]
   },
   {
    "cell_type": "code",
-   "execution_count": null,
+   "execution_count": 76,
    "id": "4ae90861",
    "metadata": {},
-   "outputs": [],
-   "source": []
+   "outputs": [
+    {
+     "name": "stderr",
+     "output_type": "stream",
+     "text": [
+      "/tmp/ipykernel_453872/1569446638.py:1: DeprecationWarning: The 'body' parameter is deprecated and will be removed in a future version. Instead use individual parameters.\n",
+      "  client.search(index='tweets',\n"
+     ]
+    },
+    {
+     "data": {
+      "text/plain": [
+       "ObjectApiResponse({'took': 18, 'timed_out': False, '_shards': {'total': 1, 'successful': 1, 'skipped': 0, 'failed': 0}, 'hits': {'total': {'value': 4875, 'relation': 'eq'}, 'max_score': None, 'hits': []}, 'aggregations': {'nb_tweets': {'doc_count_error_upper_bound': 0, 'sum_other_doc_count': 1825, 'buckets': [{'key': 'Paris, France', 'doc_count': 1427, 'sum_nb_tweets': {'value': 1427}}, {'key': 'Paris', 'doc_count': 736, 'sum_nb_tweets': {'value': 736}}, {'key': 'Ile-de-France, France', 'doc_count': 342, 'sum_nb_tweets': {'value': 342}}, {'key': 'Lille, France', 'doc_count': 191, 'sum_nb_tweets': {'value': 191}}, {'key': 'Paris, Ile-de-France', 'doc_count': 82, 'sum_nb_tweets': {'value': 82}}, {'key': 'paris', 'doc_count': 77, 'sum_nb_tweets': {'value': 77}}, {'key': '', 'doc_count': 57, 'sum_nb_tweets': {'value': 57}}, {'key': 'PARIS', 'doc_count': 53, 'sum_nb_tweets': {'value': 53}}, {'key': 'Lille ', 'doc_count': 45, 'sum_nb_tweets': {'value': 45}}, {'key': 'Montreuil, France', 'doc_count': 40, 'sum_nb_tweets': {'value': 40}}]}}})"
+      ]
+     },
+     "execution_count": 76,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "client.search(index='tweets',\n",
+    "    body={\n",
+    "            \"size\":TODO,\n",
+    "            \"aggs\": {\n",
+    "                \"TODO\":{\n",
+    "                    \"terms\" : {\n",
+    "                                \"TODO\" : \"location.keyword\"\n",
+    "                              },\n",
+    "                    \"aggs\":{\n",
+    "                                \"TODO\":{\n",
+    "                                    \"TODO\":{\n",
+    "                                            \"TODO\":\"TODO\"\n",
+    "                                        }\n",
+    "                                    }\n",
+    "                           }\n",
+    "                        }\n",
+    "                    }\n",
+    "            }) "
+   ]
   }
  ],
  "metadata": {
diff --git a/README.md b/README.md
index 2f624e7d1bdcd412b53b0f3cdcacba88991f2c39..11923ccf60598270044a8acc3be06381196e3950 100644
--- a/README.md
+++ b/README.md
@@ -91,7 +91,7 @@ Si vous êtes sur Ubuntu et vous rencontrez des problèmes, ne vous inquiétez p
 
 ```
 
-## Partie 1 : CRUD opérations d'Elastic Search avec Kibana
+## Partie 1 : CRUD opérations, Query et Aggregation dans ES
 Aller dans Kibana, dans la section "Management" de la page d'acceuil, cliquer Dev Tools>Console, nous allons répondre aux questions suivantes dans le terminal Kibana en utilisant les requêtes qu'on a vu en cours.
 
 
@@ -237,29 +237,27 @@ Résultat attendu
     $~~~~~~~~~~~~~$}  
     }
 
-#### Q9. Calculer la proportion de personnes dont le solde est strictement inférieur à 1000
-(pas sur pour cette question)
 
+On va faire maintenant des agrégations plus avancé, pour le faire, vous allez importer le fichier **account.json** dans kibana. Vous pouvez suivre les étape suivantes.    
 
-Vous allez importer le fichier **account.json** dans kibana. Vous suivez les étape suivantes.
-Vous cherchez **Integrations** dans le cosole et puis **Upload a file**.
+Chercher **Integrations** dans la barre latérale et puis cliquez sur **Upload a file**.
 ![import1](images/import1.png)
 
-Vous ajoutez le fichier **account.json**.
+Ajouter le fichier **account.json**.
 ![import2](images/import2.png)
 
-Une fois vous avez finit l'importer, vous cliquez sur le boutton **import** en bas à gauche. Vous donnez un nom au champs **index name**. Attention, vous utilizerez ce nom pour le tp suivant.
+Une fois l'importation terminée, vous cliquez sur le boutton **import** en bas à gauche. Vous donnez un nom au champs **index name**. Attention, vous utilizerez ce nom pour les questions suivantes.
 ![import3](images/import3.png)
 
 
-#### Q1. Grouper par l'âge de 20 à 30 ans, l'âge de 30 à 40 ans et l'âge plus de 40 ans et calculer l'âge moyenne
-**Note**  On utilise **ranges** aggregation pour grouper par l'âge
+#### Q9. Grouper par l'âge de 20 à 30 ans, l'âge de 30 à 40 ans et l'âge plus de 40 ans et calculer l'âge moyenne
+**Note**  On utilise **ranges** aggregation pour grouper l'âge
 
-#### Q2. Grouper par l'âge de 20 à 30 ans, l'âge de 30 à 40 ans et l'âge plus de 40 ans et calculer le salaire moyenne pour chaque groupe
+#### Q10. Grouper par l'âge de 20 à 30 ans, l'âge de 30 à 40 ans et l'âge plus de 40 ans et calculer le salaire moyenne pour chaque groupe
 
-#### Q3. Grouper la ville et le sexe et calculer le salaire moyenne pour chaque groupe.
+#### Q11. Grouper la ville et le sexe et calculer le salaire moyenne pour chaque groupe.
 
-#### Q4. Filter les villes Rennes et Paris, grouper par la ville et le sexe, calculer le salaire moyenne pour chaque groupe.
+#### Q12. Filter les villes Rennes et Paris, grouper par la ville et le sexe, calculer le salaire moyenne pour chaque groupe.
 
 ## Partie 2 : Elasticsearch Client sur Python
 
@@ -301,12 +299,10 @@ client.search(index='customer',body={"query": {"match_all": {}}})
 ```
 
 #### Q3. Traitement les données
-Pour la suite de TP, nous vous donnons un dataset rassemble 5 000 tweets contenant "grève" dans un rayon de 800 km autour de Paris, de la pérode 19/01/2023 - 26/01/2023, Dans cette question, nous avons besoin de nettoyer les données avant de les injecter dans Elasticsearch, le code pour la nettoyage est prêt, lancez et observez les données.
+Pour la suite de TP, nous vous donnons un dataset rassemble 5 000 tweets contenant "grève" dans un rayon de 800 km autour de Paris, de la pérode 19/01/2023 - 26/01/2023, Dans cette question, nous avons besoin de nettoyer les données avant de les injecter dans Elasticsearch, le code pour la nettoyage est prêt, lancez et observez les données. Essayez à répondre les questions suivantes.  
 
-#### Q3. Trouvez les tweets avec le plus de likes
-#### Q4. Trouver l'ID user qui a plus de followers
-#### Q5. Trouver les tweets postés par les influenceurs/euses (follower > 10000)
 
 
-
-## Partie 3 : Agrégation de données et visualisation dans Kibana
\ No newline at end of file
+#### Q4. Trouvez les tweets avec le plus de likes
+#### Q5. Trouver l'ID user qui a plus de followers
+#### Q6. Trouver le nombre de twitteurs (les personnes qui ont publié du tweet) par ville (utiliser aggregation & term)