Error: 2.1 - 0.0: JOIN cannot be applied directly to a table union or to a table wildcard function. Consider wrapping the table union or table wildcard function in a subquery (e.g., SELECT *).

bigquery のエラー。standard sqlから始めたのでなんのこっちゃ?だったのですが、

table wildcard function = table_date_range関数のことだったのですね。

(e.g., SELECT *)ワイルドカードとも勘違いした。。

table_date_range 使ってるテーブルをサブクエリに直せばOK。

legacy sqlは減らしていきたい。

参考

stackoverflow.com

qiita.com

pandasで時系列カラムの欠損行を埋める

ログデータから計測時間を元にgroupbyして集約データにするときに、 広告のクリックのように滅多に計測できないものの場合は その時間帯の行が無いことがある。

具体的にはこんな内容のデータ。

     click          created_at
1       1 2017-07-01 01:00:00
2       1 2017-07-01 02:00:00
3       2 2017-07-01 03:00:00
4       2 2017-07-01 04:00:00
5       2 2017-07-01 07:00:00
6       3 2017-07-01 08:00:00
7       2 2017-07-01 09:00:00
8       1 2017-07-01 10:00:00
9       1 2017-07-01 11:00:00
10      1 2017-07-01 12:00:00

5,6時の行がない。

date_range関数でSeriesオブジェクトを生成して、

indexを設定し直すことで行を埋めることができる。

事前にindexをcreated_at列に置き換えておく。

sample_log.index = sample_log.created_at
start_at, end_at = sample_log.created_at.min(), sample_log.created_at.max()
res = sample_log.reindex(pd.date_range(start_at, end_at, freq="H"))

print("[after]\n",res.head(10))

5,6時の行が増えた。click, created_at には値はなかったので

それぞれNaN, NaTとなっている。(datetime だから Not Available Time?)

[after]
                      click          created_at
2017-07-01 01:00:00    1.0 2017-07-01 01:00:00
2017-07-01 02:00:00    1.0 2017-07-01 02:00:00
2017-07-01 03:00:00    2.0 2017-07-01 03:00:00
2017-07-01 04:00:00    2.0 2017-07-01 04:00:00
2017-07-01 05:00:00    NaN                 NaT
2017-07-01 06:00:00    NaN                 NaT
2017-07-01 07:00:00    2.0 2017-07-01 07:00:00
2017-07-01 08:00:00    3.0 2017-07-01 08:00:00
2017-07-01 09:00:00    2.0 2017-07-01 09:00:00
2017-07-01 10:00:00    1.0 2017-07-01 10:00:00

ついでにカラムの欠損を埋めるとしたら

今度は逆にindexをcreated_atに上書きする。

clickはfillna関数を使って埋める。

res.created_at = res.index
res.click = res.click.fillna(0)

print("[after2]\n",res.head(10))

終結

[after2]
                      click          created_at
2017-07-01 01:00:00    1.0 2017-07-01 01:00:00
2017-07-01 02:00:00    1.0 2017-07-01 02:00:00
2017-07-01 03:00:00    2.0 2017-07-01 03:00:00
2017-07-01 04:00:00    2.0 2017-07-01 04:00:00
2017-07-01 05:00:00    0.0 2017-07-01 05:00:00
2017-07-01 06:00:00    0.0 2017-07-01 06:00:00
2017-07-01 07:00:00    2.0 2017-07-01 07:00:00
2017-07-01 08:00:00    3.0 2017-07-01 08:00:00
2017-07-01 09:00:00    2.0 2017-07-01 09:00:00
2017-07-01 10:00:00    1.0 2017-07-01 10:00:00

参考

pandas.date_range — pandas 0.20.3 documentation

pandas.DataFrame.reindex — pandas 0.20.3 documentation

pandas.DataFrame.fillna — pandas 0.20.3 documentation

RユーザがPythonを1ヶ月触ってみて

最近はRよりもPythonを触るようになったのでメモ。

RはHadleyさんの作ったライブラリ達*1を使えばなんでもできると思っている。 新しい言語を学ぶのは視点が広がるので良いです。

  • Rと比較して
    • Pythonは読みやすい。
      • インデントが良いのかな。ちゃんと書かないとシンタックスエラー出るのがちょっと面倒だけど。
      • ライブラリのメソッド名、引数の名称はがわかりやすい。(Rが難しい?)
      • 行列計算などの処理は、Rのほうが数式に近い見た目になるのでわかりやすい気がする。
    • dplyr、というよりはmagrittrのチェーン記法便利なのでPythonでも同じように書きたい。
  • Rの〜する処理、Numpyでどうするのだろう?という時によく見るページ NumPy for R (and S-Plus) users – Mathesaurus

以下Python環境でお世話になってるツールなど。

*1:ggplot2, dplyr, reshape2, stringrなどなど https://github.com/hadley/

Dockerでデータ解析環境を作ってみようとしたらほぼ揃ってた。

Dockerを触る機会があったので試してみる。

目標はデータ解析環境の構築 PostgresqlのDBサーバと R、もしくはpython実行環境。 最終的にJupyterでブラウザから操作できたらうれしい。

。。。と思っていたらJupyter+R、Python、ついでにJuliaの環境がまるっとそろった Dockerfileがあった。

github.com

datascience-notebookってやつのDockerfileを持ってくれば ちょいとデータ解析やる環境て意味ではこれで充分そう。

DockerHubのほうのリンクはこちら。 https://hub.docker.com/r/jupyter/datascience-notebook/

thinkstats2 1章

英語は無償で読めるのだけど、そこに時間を使うのもアレなので本を購入。 ただ、githubにある演習問題は英語だったので、結局読むことに。まぁ本文読むよりは良いけれど。

演習の2つ目の穴埋めで早速ハマる。coodbook のページは度数分布表になっているので、1つ目のような単なる一覧ではまずいのか? ということでpython, pandas の使いかたを調べる。

※答えのほう(chap01soln.ipynb)はそのまま出力すれば良いだけだったので間違いじゃなかったぽい。

import pandas as pd

prgl = df.prglngth.value_counts().sort_index().to_frame("val_cnt")
prgl["prglngth_g"]=pd.cut(prgl.index,3)
print(prgl[['prglngth_g','val_cnt']].groupby('prglngth_g').sum())
                  val_cnt
prglngth_g               
(-0.05, 16.667]      3634
(16.667, 33.333]     1149
(33.333, 50]         8810
# 直接ビンの指定もできる。
prgl["prglngth_g"]=pd.cut(prgl.index,(0,13,26,50))
print(prgl[['prglngth_g','val_cnt']].groupby('prglngth_g').sum())
            val_cnt
prglngth_g         
(0, 13]        3507
(13, 26]        793
(26, 50]       9278

Rでも全く同じ関数でcutがあった。Rのdata.frameは割りとイメージできるので、R cut in python とかで調べると良いのかも。

参考: http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.cut.html

年末の大掃除。【統計・機械学習系の積み本編】

この記事は Advent Calendar 2015 - VOYAGE GROUP 5日目の担当分です。

私、@yuu_ito はVOYAGE GROUPでデータ見て考えて整理する業務に携わっています。

仕事について今年を振り返ってみると、新しい技術に触れたり、学ぶ事もたくさんあったので 全体的に楽しく過ごせたと思っています。

ただ、興味はあって始めてみようとしても継続せずそのまま。。なんてこともありました。

今この記事を読んでいる人の中にも、 オライリーのEbookやKindleでポチったけど開いてすらいない本がたくさんある方がいらっしゃるのでは。|д゚)チラッ

ということでこの記事では私の今年購入した本について晒して整理してみます。

消化済。読み進め中の本

www.amazon.co.jp

  • 通称:みどり本。社内の輪読会にて読了できました!
  • ベイズ推定、MCMC周りの理解はこの本のおかげかも。
  • コードはRとwinbugsというMCMCライブラリですが、Rstanで書きなおして写経したりしました。面倒ですが手を動かすと理解は深まりますね。

www.amazon.co.jp

  • ご存知PRMLですね。ネットで調べると「復習レーン」とか「~のための学習」みたいな情報もあったりで、私と同様苦労している方もいるみたいです。
  • こちらも社内の人たちと定期的に読んでいます。みどり本に比べると結構難しいです。
  • 上巻の4章が終わる辺りまで読みました。下巻が楽しみです。

www.amazon.co.jp

  • 演習問題がgithubに公開されていて iPython notebook でコードを書いてゆく形式になっています。実は原書(英語)は無料で読めます。
  • さっと眺めた感じ、統計学に関する用語を体系的に理解できそう。
  • 社内もくもく会(会議室で個々に黙々こなす会)が始まったのですが、初回でれず。

積み本。。

www.amazon.co.jp

  • とりあえず、5章までは読みました。
  • 元々はもくもく会の題材に挙がり、コードでアルゴリズムを理解できそうという事で買ってはみたのですが、 あまりコードについて解説している内容でなかったのでもくもくは中断。もくもく会は上で紹介したThink Statsに方向転換しました。
  • PRMLの上巻と内容はかぶっていますが、より数式や図が丁寧に書かれています。 私のようにPRMLでくじけそうな人はこれを読んでからだと「なるほどー」となりそう。

www.amazon.co.jp

  • 紹介した本の中では割りと最初のほうに購入した本なのですが。。
  • PRMLや他の書籍で数式がわからなくなった時につまみ読みしていますが、しっかり読みいないです。
  • 改めて開いてみるとLU分解とかの理論に加えて実装時のポイントも書いてあって良さそう。

www.amazon.co.jp

  • 恥ずかしなら、勢いでポチってしまった本。時系列データ分析を勉強し始めた時に買ってしまったが、 事前の知識が足りないせいか全く進まずに気づいたら積み本に。

www.amazon.co.jp

  • こちらも↑の本と一緒に買ったもの。数式厳しくてもコード書かれているのでイケるか! と思ったのですが当時は理解が足らず。。
  • 改めて開いてみたらイケそうな気がしました。

まとめ

いかがでしょうか?多分まだまだPCの中やウチの本棚の中に眠っているのがあるかもしれないですが、 思い出せるところはこんなところです。

やはり 人を巻き込んで勉強しているものについては無理にでも読み進めてることができている感じがあります。 輪読会とかで担当すれば担当分の理解は深まりますし、分からなくても周りに相談できます。 逆に積んでしまったものは、誰かしら巻き込んでとっかかりを作ってしまえば良いかもしれないですね。 そして自分の知識、スキルとして昇華させるには、勉強会に参加するだけでなく自分の手を動かすのが一番だと思います。

次回は @brtriver さんです。お楽しみに!