diff --git a/README.md b/README.md
index 33447cf463a1373a2833a2a1ff2bcffb8bca1e2b..729694377e388f163caf085505703ffa47ab0901 100644
--- a/README.md
+++ b/README.md
@@ -231,4 +231,55 @@ Résultat attendu
 #### Q9. Calculer la proportion de personnes dont le solde est strictement inférieur à 1000
 (pas sur pour cette question)
 
-## Partie 2 : API Elasticsearch
+## Partie 2 : Elasticsearch Client sur Python
+
+Pour cette partie là, on exploitera comment intéragir avec Elasticsearch sur Python. Vous pouvez utiliser IDE comme vous voulez.  
+**Note** : à part d'Elasticsearch, d'ici, on a également besoin de librairie pandas
+#### Q1. Installer Elasticsearch, importer dans Python
+
+>pip3 install elasticsearch
+
+Dans votre script python :
+>import elasticsearch   
+from elasticsearch import Elasticsearch
+
+Voir la version elasticsearch :
+>print (elasticsearch.VERSION)
+
+D'ici, j'utilise la version 8.6.0
+#### Q2. Connecter avec le server Elasticsearch
+>ELASTIC_PASSWORD = {Votre password}  
+client = Elasticsearch(  
+"https://localhost:9200",  
+ca_certs="path/vers/http_ca.cert",  
+basic_auth=("elastic", ELASTIC_PASSWORD)  
+)
+
+Il faut checker si tout va bien en lancant :
+
+> client.info()
+
+La réponse doit rassemble à cela :
+
+![attendu2](/images/connectapipython.PNG)
+
+Vous pouvez également prendre les données qu'on a créé dans la 1ère partie :
+> client.search(index='customer',body={"query": {"match_all": {}}})
+#### Q3. Traitement les données
+Pour la suite de TP, nous vous donnons un dataset qui est les tweets qui ont hashtag #Farmersprotest. Dans cette question, nous avons besoin de nettoyer les données avant injecter dans Elasticsearch
+#### 3.1. Lire les données au format JSON
+Hint: Utiliser pandas.read_json('/path/des/données',lines=True)
+#### 3.2. Filtrer
+Nous n'utilisons que les tweets en Anglais et nous ne voulons pas de doublons. En plus, il n'y a que les colonnes : id, date, user, renderedContent qui nous servirons pour la suite. Renommer le champ id -> tweetID pour distinguer. La table résultant appelé raw_tweets
+
+Appeler la fonction head() pour voir les résultats
+#### 3.3. Flatten nested champ
+Nous voyons que le champ "user" est nested, essayons de créér un table à partir de ce champ. Supprimer de doublons. Nous ne gardons que les colonnes : id, location. Renommer le champ id -> userID pour distinguer. La table résultant appelé users  
+
+Hint: Utiliser pandas.json_normalize, il faut importer avant utiliser
+#### 3.4. Créer la table finale
+La table finale appelé "tweets" est créé en mergent les 2 tables précédentes.
+
+#### Q4. Injection les données dans Elasticsearch
+
+## Partie 3 : Agrégation de données et visualisation dans Kibana
diff --git a/images/connectapipython.PNG b/images/connectapipython.PNG
new file mode 100644
index 0000000000000000000000000000000000000000..88895be5e4d721c979d8126333ee602d6409cde7
Binary files /dev/null and b/images/connectapipython.PNG differ