読者です 読者をやめる 読者になる 読者になる

uyamazakのブログ

仕事中の問題と解決メモ。PythonとGoogle Cloudがメイン。bizoceanで新規事業の企画と開発担当。 BigQueryを使ったビッグデータ収集・解析・リアルタイム処理プロジェクト進行中 https://github.com/uyamazak/oceanus

Google Cloud Datalab localで日時レポート出力

jupyterのGoogleカスタマイズ版であるGoogle cloud Datalabはこれまで、GAE上でしか動かなかったので、安いとはいえ課金にちょっと抵抗があった。


でも最近ではベータ版ではDokcerイメージで配布され、ローカルでも動くようになったので試してみた。ローカルではなく社内のLinuxサーバーにインストールした。


これからDockerはアプリのパッケージ的使い方でも普及していきそう。


Quickstarts  |  Google Cloud Datalab  |  Google Cloud Platform


ボリュームのマウントは、notebookが再起動で消えてしまうので必須。

設定後、右上でGoogleアカウントで認証すれば、BigQuery、CloudStrageなどそのままアクセスできて便利。

%sql

でBigQueryのクエリを書いて、

%chart 


で、Google Chartで出力できる。
出力する際は、

%sql --module module_name


で変数にいれて

%chart pie -f age,count --data module_name


のような感じ。


どんなチャートがあるか一覧で見たいときはチャートギャラリーがおすすめ。

Chart Gallery  |  Charts  |  Google Developers


チャートの使い方がわからないときは

%chart -h

選んだ種類ごとにオプションが違うので指定したうえで-hすればさらに詳しく見れる。

%chart pie -h

%htmlで始めればHTMLもそのまま書ける

Pythonで書きたい場合は

import datalab.bigquery as bq
bq.Query("SELECT * FROM hoge").results()

などで


BigQueryのテーブル名を調べたいときも

%bigquery tables -f bizoceean*

ワイルドカードで検索した結果を出力できる。


この結果を会社の人に見せる際は、コマンドでHTMLで出力できる。


ホストマシンにjupyterを入れるか、docker execで

sudo jupyter nbconvert --to html USER_RANK.ipynb

でHTMLで同じディレクトリに出力されるので、これをメールで送るなり、Google Driveに入れるなりすればおk


ファイル名に日付を使いたいときは、dateコマンドで

sudo jupyter nbconvert --to html USER_RANK.ipynb --output=user_rank_`date "+%Y%m%d"`.html

また、決まった日時レポートでは、コードはスクロールが大変で見づらくなるため、グラフ、表だけ表示した方が良い。

検索してみたら、javascriptでコードを消す方法があった。


github.com

Google cloud datalabでは

%html
<script>
    var code_show=true; //true -> hide code at first

    function code_toggle() {
        $('div.prompt').hide(); // always hide prompt

        if (code_show){
            $('div.input').hide();
        } else {
            $('div.input').show();
        }
        code_show = !code_show
    }
    $( document ).ready(code_toggle);
</script>
<a href="javascript:code_toggle()">[Toggle Code]</a>

で書けた。

ほんと便利なツールです。
BigQueryのクエリー料金などがかかるのは、どこでもいっしょなのでそれはいいとして、無料で十分すぎるし、みんながこれを使ったらTableauとか死ぬんじゃないだろうか。