
Python Pandas Dataframe’i Elasticsearch’e Yazmak
Merhabalar bu yazımızda Python Pandas Dataframe verisini Python kullanarak Elasticsearch’e yazacağız. Şükür ki Python çok gelişmiş ve zengin bir dil. Birileri biz kullanalım diye kütüphane yazmış, biz de bunu kullanarak dataframe’i Elasticsearch’e yazacağız. Bu yazıyı takip etmek için bazı ön koşullarımız olacak.
- Elasticsearch 7.3.0 kurulu ve 9200 portundan erişilebilir durumdadır. Örneğin, benim elasticsearch sunucum aşağıdaki adreste şuan çalışıyor. Yüklü değil ise docker ile hızlı bir şekilde kullanıma hazır hale getirebilirsiniz.

- Python3 yüklü ve çalışır durumdadır.
- Kullanacağımız modülün adı elasticsearch. python -m pip install elasticsearch komutu ile bu modülü yüklemiş durumdasınız.
- Kullanacağımız veri setine buradan ulaşabilirsiniz.
- Jupyter kullanabiliyorsunuz.

O halde başlayalım.
Veri seti, bir market müşterilerine ait üretilmiş sentetik bir veri seti. Müşterinin gelir, yaş ve cinsiyet gibi özelliklerine göre ne kadar alış-veriş yaptığıyla ilgili.
Kütüphanelerimizi indirelim:
# Kütüphaneler import pandas as pd from elasticsearch import Elasticsearch, helpers
Elasticsearh sınıfından nesne yaratalım. Biliyoruz ki bu yazıda ağırlıklı olarak elasticsearch modülünü kullanacağız. Sizin elasticsearch sunucunuz farklı olabilir. Genelde: localhost:9200
# Elasticsearch sunucusuna bağlanan Elasticsearch sınıfından bir nesne yaratalım es = Elasticsearch("elasticsearch1.impektra.com:9200")
Veriyi okuyup dataframe olarak tutalım:
mall_customers = pd.read_csv("https://raw.githubusercontent.com/erkansirin78/datasets/master/Mall_Customers.csv") mall_customers.head()
CustomerID Gender Age AnnualIncome SpendingScore 0 1 Male 19 15000 39 1 2 Male 21 15000 81 2 3 Female 20 16000 6 3 4 Female 23 16000 77 4 5 Female 31 17000 40
Dataframe’i okuyup Elasticsearche yazan bir fonksiyon yazalım:
def dataframe_to_es(): i = 0 for index, line in mall_customers.iterrows(): yield { "_index": "mallcustomers", "_id":i, "_source": { "CustomerID": line[0], "Gender": line[1], "Age": line[2], "AnnualIncome": line[3], "SpendingScore": line[4] } } i += 1
Şimdi fonksiyonu kullanalım, ancak eğer varsa indeksi silelim. Çünkü indeks veri aktarılırken otomatik yaratılacakt. Bunu biraz da ilişkisel veri tabanındaki CREATE TABLE IF NOT EXIST sql cümleciğine benzetebiliriz. Daha sonra fonksiyonu kullanarak aktarma işlemini gerekleştirelim.
# Eğer varsa indeksi silelim if es.indices.exists('mallcustomers'): es.indices.delete('mallcustomers') helpers.bulk(es, dataframe_to_es())
Çıktı:
(200, [])
şeklinde olacaktır.
Şimdi elasticsearch’e yazdığımız veriye ulaşalım.
res = es.get(index="mallcustomers", id=0) res
Çıktı:
{'_index': 'mallcustomers', '_type': '_doc', '_id': '0', '_version': 1, '_seq_no': 0, '_primary_term': 1, 'found': True, '_source': {'CustomerID': 1, 'Gender': 'Male', 'Age': 19, 'AnnualIncome': 15000, 'SpendingScore': 39}}
Basit bir arama yapalım:
res = es.search(index='mallcustomers', body={ "query":{ "match":{ "Gender":"Female" } } })
res sözlüğündeki sonuçları görelim.
res['hits']['hits'][:3]
Çıktısı:
[{'_index': 'mallcustomers', '_type': '_doc', '_id': '2', '_score': 0.5803517, '_source': {'CustomerID': 3, 'Gender': 'Female', 'Age': 20, 'AnnualIncome': 16000, 'SpendingScore': 6}}, {'_index': 'mallcustomers', '_type': '_doc', '_id': '3', '_score': 0.5803517, '_source': {'CustomerID': 4, 'Gender': 'Female', 'Age': 23, 'AnnualIncome': 16000, 'SpendingScore': 77}}, {'_index': 'mallcustomers', '_type': '_doc', '_id': '4', '_score': 0.5803517, '_source': {'CustomerID': 5, 'Gender': 'Female', 'Age': 31, 'AnnualIncome': 17000, 'SpendingScore': 40}}]
İşte bu kadar. Hayırlı olsun. Elasticsearch’ün json dünyasında kaybolmadan python yeteneklerinizi kullanarak bir dataframe’i Elasticsearch’e aktardınız.
Başka bir yazıda görüşmek dileğiyle, mutlu analizler…