Python使いのためのBigQuery連携

# PythonとBigQueryのコラボ
データ分析を行う上で、PythonとBigQueryの組み合わせはなかなかに相性がよいです。
   
Pythonは巨大すぎるデータの扱いには向いていませんが、その部分だけをBigQueryにやらせてしまい、データを小さく切り出してしまえば、あとはPythonで自由自在です。

問題はPythonとBigQueryをどう連携するかですが、これは大きく2つの方法があります

1. PythonのBigQuery連携ライブラリを使う
2. [Google Cloud Datalab](https://cloud.google.com/datalab/)を使う

2は特に[Jupyter Notebook](http://jupyter.org/)を使い慣れている人におすすめです。



# 1.PythonのBigQuery連携ライブラリを使う

## オススメのライブラリ
PythonからBigQueryを叩くためのライブラリはいくつかあります。
例えば、[BigQuery-Python](https://github.com/tylertreat/BigQuery-Python)、[bigquery_py](https://pypi.python.org/pypi/bigquery/2.0.17) など。

しかし、実は__一番簡単でオススメ__なのはPandas.ioのいちモジュールである[pandas.io.gbq](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.gbq.read_gbq.html)です。
DataFrameオブジェクトとの相性が良く、また認証が非常に簡単なため、あまり難しいことを気にせずに使うことができる点が素晴らしいです。

## pandas.io.gbqの認証方法
```pandas.io.gbq``` を使う上で必要になるのは、BigQueryの ```プロジェクトID``` のみです。
記法は下記のとおりです。
この例では、```data_frame```に ```SELECT * FROM tablename```の結果が格納され、その後は普通のDFオブジェクトとして使えます。
   

```py3
import pandas as pd
query = 'SELECT * FROM tablename'

# strベースのクエリと、project_idが必要
data_frame = pd.read_gbq(query, 'project-id')
```

実行するとクエリのプロセスの簡単な統計を返してくれます
（統計情報を非表示にしたい場合は、引数でverbose=Falseを指定）

実行例
![image](https://qiita-image-store.s3.amazonaws.com/0/68432/e653d159-7685-e2f3-b6eb-d474cd44fbf6.png)


pd.read_gbqを実行すると、ブラウザでGoogle Accountの認証画面が開きます。
該当のprojectにアクセス可能なアカウントでログインすると、連携認証が完了し、処理が開始されます。
   
この際、json形式の ```credential file``` が作業フォルダに吐かれます。このファイルがある限りは再度の認証無しで何度もクエリを叩けます。
逆に言えば、このファイルが人手に渡ると勝手にBigQueryを使われてパケ死することになるので、ファイルの管理には注意してください。
http://qiita.com/itkr/items/745d54c781badc148bb9


## PythonからBigQuery側への書き込みも可能
なお、Python DataFrameオブジェクトをBigQuery上のテーブルとして書き込むことも簡単にできます。
[ライブラリ公式ドキュメント](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.io.gbq.to_gbq.html)

```py3
from pandas.io import gbq
gbq.to_gbq(df, '書き込み先のテーブル', 'プロジェクトID')
```

これだけで、Pythonで使ったDFオブジェクトをBigQueryに返すことができます。


ここまでできるようになると、例えば

```
①BigQueryからユーザの特徴量データを取ってくる（read_bgq）
↓
②Pythonでコネコネ、データ加工(pandas)
↓
③機械学習モデルでユーザにラベル付などを行う(scikielearn)
↓
④ラベル付の結果をBigQueryに返す(gbq.to_gbq)
```

みたいなことが割りと簡単にできるようになります。うーん素晴らしい
Pandasって本当に便利


# 2. Google Cloud Datalabを使う
![image](https://qiita-image-store.s3.amazonaws.com/0/68432/e958bf6f-d600-5ab0-cef3-746e748963fc.png)

## Cloud Datalabとは
DatalabはGoogle Compute Engine上に構築される、[jupyter notebook](http://jupyter.org/)（旧名iPython-Notebook）をベースとした対話型のクラウド分析環境です。
操作はブラウザで閲覧&記述が可能な「Notebook」と呼ばれるインターフェースにコードを書いていくことで行われます。
   
ざっと下記のような利点があります。

- インタラクティブな操作
- Notebook形式でクエリ、結果、図表 を残しておける
    - Markdown形式の文章と、コードの共存
    - コードの実行結果（図表含む）のインライン表示
- Pythonとのシームレスな連携(同じコンソール内でPythonもSQLも使える)
- Google Compute Engine上に環境が自動構築されるため、
    - ローカル環境を圧迫しない
    - クエリの共有などが容易

  
文章を読んでもピンとこないと思うので、動画や画像を見ていただくのが一番早いかも

[動画]
https://www.youtube.com/watch?v=RzIjz5HQIx4

[使用例の画像]
![image](https://qiita-image-store.s3.amazonaws.com/0/68432/00c82536-3863-7580-99f8-786aae4d28b6.png)

```
一行目の文字はMarkdown,
１つめのセルはSQL、2つめのセルはPythonで書かれている
グラフなどもインライン表示される
（グラフだけでなく、テーブルも当然表示できる）
```


## どうやって始めるのか

ベータ版なので（?）、GCPのコンソールから直接は機能をオンにできない
このページからプロジェクトを選んでDeployすると機能が使えるようになる
    
なお、機能をonにできるのはオーナー権限もしくは編集権限の所有者だけの模様
プロジェクトにDeployされれば、プロジェクトのメンバ全員が使えるようになる

  
>Cloud Datalab is deployed as a Google App Engine application module in the selected project. The Google Compute Engine and Google BigQuery APIs must be enabled for the project, and you must be authorized to use the project as an owner or editor.

スタート画面の画像
![image](https://qiita-image-store.s3.amazonaws.com/0/68432/23bfd55b-de27-1b34-1270-31b497eb6f9a.png)


## 始めると何が起こるのか

### 環境

Google Compute Engine上にDatalab用のインスタンスが立ち上げられ、その上にDatalabの環境が構築されます。
Datalabのインターフェースはブラウザから操作することが可能です。
（もちろんこの環境へも普通にSSH接続可能）
    
ブラウザ上で書いたNotebook（SQLとPythonコード）はこのインスタンス上に保存されていきます（=みんなで見れる）
   
GCPのコンソールにはDatalabの機能をオンにする入り口はないが、Datalabを使っているとインスタンス一覧には「Datalab」が表示されます


### 料金

GCEのインスタンス分は料金がかかります（ ~数千円？インスタンスのスペック次第）
もちろんBigQueryを叩いた分の料金もかかります。

Datalab公式

> You only pay for the resources you use to run Cloud Datalab, as follows:

> **Compute Resources**
Cloud Datalab uses Google App Engine and Google Compute Engine resources to run within your project. When you have Cloud Datalab instances deployed within your project, you incur compute charges —the charge for one VM per Cloud Datalab instance

> **Google BigQuery**
-You incur BigQuery charges when issuing SQL queries within Cloud Datalab

>**Other Resources**
—You incur charges for other API requests you make within the Cloud Datalab environment.


## 参考 - 使ってるらしき他社の情報（国内）

Voyage Group
http://www.slideshare.net/hagino_3000/cloud-datalabbigquery
Vasily
http://tech.vasily.jp/entry/cloud-datalab
ワンダープラネット
http://wonderpla.net/blog/engineer/Try_GoogleCloudDatalab/