Edited at

pandas-td0.8.0にmagic functionが導入されてもっと便利になったよ!

More than 3 years have passed since last update.

pandas-tdにmagic functionが導入されてもっと便利になったよ!という話を書きます。

pandasとかが何かという話はこちらのTreasureDataとPandasとJupyterでインタラクティブにデータを可視化する。を見てね。

けれどもpandasを簡単にいうと、統計分析とかができるライブラリなんだけど、いろんなデータソースへ接続するためのインタフェースにできて、便利なのです。

個人的なユースケースとしては、お客さんの問い合わせがあったら、TD上のログとかRDBとかから必要な情報をとってきてくっつけたりしてます。あとはその調査した結果をjupyterを使っているので、githubで簡単に共有できるようにしてます。

そして、今回pandas-td 0.8から導入されたmagic functionは、事前に関数を作っておくと、%,%%だけでその関数を呼び出せるという機能です。

これだけだと、なにが便利なのかわかりにくいので、実際に使ってみましょう。


今まで

は、下記のように一個一個の接続情報を作って、関数を使って、とコピペでは済むけれども必要な記載が結構あり、ただSQLを発行するだけでもPython力が必要でした。

import os

import pandas_td as td

# Initialize connection
con = td.connect(apikey=os.environ['TD_API_KEY'], endpoint='https://api.treasuredata.com/')
engine = con.query_engine(database='sample_datasets', type='presto')

# Read Treasure Data query into a DataFrame.
df = td.read_td('select * from www_access', engine)


Magic Functionを使うと

これですむ。

%td_use sample_datasets

%%td_presto
select count(1) cnt
from nasdaq

しかも、%%td_useのあとにテーブル名を打つと、スキーマも見れる

nasdaq

しかも、カラム名のタブ保管も有効になる!

%matplotlib inlineを有効にしておいて、%%td_presto_plotのマジックコメントでクエリを投げると、すぐに可視化してくれる!!

便利。


どうやって使うのか?


  • 環境変数にAPIKEYをセットする

$ export TD_API_KEY=1234/abcd...


  • マジックコメントを自動でロードさせておく(手動でもいいけど)

~/.ipython/profile_default/ipython_config.pyに下記の内容を保存する。

c = get_config()

c.InteractiveShellApp.extensions = [
'pandas_td.ipython',
]


もっかい言うけど、

これだけで、あとはJupyter(ipython)を起動させると、自動でロードされてつかえるようになるよ!

クエリも!

タブ保管も!

簡単な可視化も!


まだちょっとめんどくさいところ

取得したデータの文字列が長かったり、カラム数が多かったりで省略表示されている場合に、ちょっとカラムのデータを見たいなというときに、

いちいちコマンド実行するのがだるい。

今は、to_csvで、CSV出力をしてエディタで最後はみちゃうことあります。

あとは、x = %td_databasesという代入はできるけれども、x = %%td_prestoという方法で代入ができないので、そこができる方法があると嬉しい。

あまりスクリプト的な内容を必要としな場合にはこれで十分といえば十分ですねー。

ちゃんちゃん。


補足

@k24d さんに、_を使うと前回の実行結果の値を代入できたり、Out[5]の結果を代入できることを教えていただきました。

つまり、下のあとに

%%td_presto

select
td_date_trunc('hour', time) as time,
COUNT(1) as code200_cnt
from
www_access
WHERE code = 200
group by
1

x = _

だったり、

x = Out[40]

でできました!

便利!!