今回は、Python及びPythonのライブラリ、pytdとmatplotlib/seabornを使用したTreasure Data CDPに蓄積されているデータの可視化についてご紹介します。Treasure Data CDPにデータが蓄積され始めてきて、データの分析を検討されている方にお役に立てる内容かと思います。
対象者
- Treasure Data CDPでデータの蓄積がある程度完了している
- クエリの実行結果を都度ダウンロードし、Excelやスプレッドシートでチャートや集計表を作成していて工数がかかっている
- BIツールの導入・運用はコスト面で時期尚早だと感じている
pytd, pandas, matplotlib, seabornとは
pytdとは
pytdはPythonを利用してTreasure DataのREST API、Prestoクエリエンジン及びPlazmaプライマリストレージへの容易なアクセスを可能とするライブラリです。
詳細はリファレンスサイトをご覧ください。
合わせて、弊社エンジニアの記事もご参照いただければ幸甚です。
pytdでの意図しないデータ変換について
pandasとは
pandasはPythonでDataFrameというデータ構造を扱えるようにするライブラリです。
詳細はリファレンスサイトをご覧ください。
matplotlibとは
matplotlibは、Pythonを利用したビジュアライゼーションで用いられる定番のライブラリです。
分析で用いられるJupyter Notebookといった環境でグラフを表示できます。
詳細はリファレンスサイトをご覧ください
seabornとは
seabornはmatplotlibをベースにしたPythonのデータビジュアライゼーションライブラリで、matplotlibよりも比較的少ないコードでグラフを表示できます。
詳細はリファレンスサイトをご覧ください。
実行環境について
- Mac OS 11.5.2
- Python 3.9
- pytd 1.4.0
- pandas 1.3.4
- matplotlib 3.4.3
- seaborn 0.11.2
使用するデータについて
Treasure Data CDPでデフォルトで入っている、sampledatasets/nasdaqという、NASDAQの日別のティッカーシンボル毎の取引高・高値・安値・終値を格納したテーブルを使用します。以下はサンプルデータです。
APIキーの確認方法について
pytdでTreasure Data CDPにアクセスしデータを取得するために、APIキーというものを使用します。こちらの確認方法を記載します。
- ログイン後の画面で左下の自分のアイコンをマウスオーバーする
- API Keysをクリックする
- Master keyの文字列をコピーして控える
APIキーについては安易に他人に伝えることなく厳重に管理をしてください。
pytdでのTreasure Data CDPからのデータ取得方法
pytdでTreasure Data CDPに接続しデータを取得するには、引数にapikey、endpoint、database、default_engineを指定し接続情報を作成します。
今回は便宜的に直接コード内にAPIキーを記載していますが、環境変数に格納するなど実行環境に応じてセキュリティ上適切な扱いをしてください。その後作成した接続情報からSQLを実行し得られた結果をpandasのDataFrameに格納します。
今回は、PC向けOSで有名なMicrosoft Corp. ( MSFT )と画像処理ソフトで有名なAdobe Inc. ( ADBE )の株価について各年の最終日終値を抽出しています。以下はサンプルコードです。
client = pytd.Client(apikey='*********************************************', endpoint='https://api.treasuredata.com/', database='sample_datasets', default_engine='presto') res = client.query('WITH t1 AS ( SELECT symbol ,TD_TIME_FORMAT(time,'yyyy','EST') as year ,MAX(time) as max FROM nasdaq WHERE symbol IN ('MSFT','ADBE') GROUP BY 1,2 ) SELECT nasdaq.symbol ,TD_TIME_FORMAT(nasdaq.time,'yyyy','EST') as year ,nasdaq.close FROM nasdaq INNER JOIN t1 ON nasdaq.symbol = t1.symbol AND nasdaq.time = t1.max ORDER BY 2,1 ') df = pd.DataFrame(**res)
取得されたデータのサンプル
seabornによるチャート(折れ線グラフ)の描画
seabornで折れ線グラフを描画するには、lineplotメソッドを使用します。X軸、Y軸それぞれに当てはめたい列を指定し、dataに先ほど抽出してきたDataFrameを指定します。
そのままだとX軸の年が横向きで見づらいため、xticksを使用してラベルの向きを90°横にします。
sns.lineplot(x="year", y="close", hue="symbol", data=df) plt.xticks(rotation=90) plt.show()
コード全体
pytdによるデータの取得とseabornによる折れ線グラフの描画のコード及び各種ライブラリのインポートを合わせたコード全体が以下になります。
import pytd import pandas as pd import matplotlib.pyplot as plt import seaborn as sns if __name__ == '__main__': client = pytd.Client(apikey='*********************************************', endpoint='https://api.treasuredata.com/', database='sample_datasets', default_engine='presto') res = client.query('WITH t1 AS ( SELECT symbol ,TD_TIME_FORMAT(time,'yyyy','EST') as year ,MAX(time) as max FROM nasdaq WHERE symbol IN ('MSFT','ADBE') GROUP BY 1,2 ) SELECT nasdaq.symbol ,TD_TIME_FORMAT(nasdaq.time,'yyyy','EST') as year ,nasdaq.close FROM nasdaq INNER JOIN t1 ON nasdaq.symbol = t1.symbol AND nasdaq.time = t1.max ORDER BY 2,1 ') df = pd.DataFrame(**res) print(df.head()) sns.lineplot(x="year", y="close", hue="symbol", data=df) plt.xticks(rotation=90) plt.show()
本コードを実行すると、以下のような折れ線グラフが描画されると思います。
1999年〜2000年にかけての高騰はドットコム・バブル、2008年の急激な落ち込みはリーマンショックなど単純な集計でもわかることがありますね。
おわりに
クエリはコード中に記載すると長くなった場合見づらくなるので、別途テキストファイルから読み込むなどの工夫の余地はあると思いますがTreasure Data CDPからのデータの抽出・可視化についてはそれほど手間をかけず行えることがご理解頂けたのではないでしょうか。
データは定期的にチェックすることで変化への気づきなどが得られるので、次回は描画したチャートをメールやSlackなどで関係者に共有する方法についてご案内したいと思います。
この記事が少しでも参考になりましたら幸いです。
商標
Excelは、米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
Slackは、Slack Technologies, Inc.の登録商標です。
参考書籍
小久保 奈都弥(2020)『データ分析者のためのPythonデータビジュアライゼーション入門 コードと連動してわかる可視化手法』翔泳社.