Help us understand the problem. What is going on with this article?

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

image0

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

image3

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

image4

便利。

どうやって使うのか?

  • 環境変数にAPIKEYをセットする
$ export TD_API_KEY=1234/abcd...
  • マジックコメントを自動でロードさせておく(手動でもいいけど)

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

c = get_config()

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

もっかい言うけど、

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

image1

クエリも!
image2

タブ保管も!
image3

簡単な可視化も!
image4

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

取得したデータの文字列が長かったり、カラム数が多かったりで省略表示されている場合に、ちょっとカラムのデータを見たいなというときに、
いちいちコマンド実行するのがだるい。
今は、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]

でできました!
便利!!

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away