前回は、PythonからElasticsearchのデータを取得する方法を紹介しました。
ElasticsearchのAPIを使用すると、JSON形式でデータを取得します。
一方、Pythonでデータ分析等を行う際は、Pandasのデータフレーム形式の方が扱いやすいです。
そこで今回は、Elasticsearchから取得したデータを、Pandasのデータフレームに変換するまでの処理を紹介していきたいと思います。
Elasticsearchからデータを取得する
Elasticsearchへの接続からデータ取得は、以下のようにしました。
from elasticsearch import Elasticsearch
#接続
es = Elasticsearch("http://localhost:9200")
#インデックスからデータ取得
SearchResult = es.search(index="boston", size=1000)
result = SearchResult["hits"]["hits"]
この辺の細かいことについては、以下の記事に書いています。
取得したデータをデータフレームに変換する
変数resultの中身をデータフレームに変換していきます。
resultは、辞書型データの配列になっています。目当てのデータは、配列の各要素の”_source”に格納されています。
なので、for文で各要素の”_source”を取り出し、1つのデータフレームとして結合していくのが得策です。
import pandas as pd
#空のデータフレーム作成
df = pd.DataFrame()
#1行ずつデータを追加
for record in result:
#JSON形式をデータフレームに変換
df_record = pd.json_normalize(record["_source"])
df = df.append(df_record)
df = df.reset_index(drop=True)
“_source”は辞書型なので、pandasのjson_normalize()を使ってデータフレームに変換します。
こうすることで、以下のようなデータフレームを作成することができます。
最後の1行は、インデックスの再振り付けをしています。
コード全文
Elasticsearch接続からデータフレーム作成までのソースコードは以下の通りです。
from elasticsearch import Elasticsearch
import pandas as pd
#接続
es = Elasticsearch("http://localhost:9200")
#インデックスからデータ取得
SearchResult = es.search(index="boston", size=1000)
result = SearchResult["hits"]["hits"]
#空のデータフレーム作成
df = pd.DataFrame()
#1行ずつデータを追加
for record in result:
#JSON形式をデータフレームに変換
df_record = pd.json_normalize(record["_source"])
df = df.append(df_record)
df = df.reset_index(drop=True)
まとめ
PythonでElasticsearchからデータを取得したら、pandasを使ってデータ分析をするケースも少なくないのではないでしょうか。
ネストのデータ構造なのでやや複雑な感じもしますが、原理がわかれば応用も効くので、是非参考にしてみてください!
ではでは👋