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 *).
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
RユーザがPythonを1ヶ月触ってみて
最近はRよりもPythonを触るようになったのでメモ。
RはHadleyさんの作ったライブラリ達*1を使えばなんでもできると思っている。 新しい言語を学ぶのは視点が広がるので良いです。
- Rと比較して
- Rの〜する処理、Numpyでどうするのだろう?という時によく見るページ NumPy for R (and S-Plus) users – Mathesaurus
以下Python環境でお世話になってるツールなど。
- pyenv
- Pythonのバージョン管理
- GitHub - yyuu/pyenv: Simple Python version management
- anacondaバージョンのPythonいれておけばとりあえずだいだいやりたい事ができる。
pip: Python のパッケージ管理ツール
- Python Package Index(pypi) からパッケージを検索する
- PyPI - the Python Package Index : Python Package Index
jupyter notebook
- グラフの可視化に使っています。 jupyter.org
- 環境によってはpip install でハマるけど、anacondaにはプリインストールされてるので嬉しい。
- もともとRを触ってる時にIRKernelを試していたのもありそのままR-->Pythonに切替。 https://irkernel.github.io/
Cython
- 拡張C言語。Pythonの記述でc言語を生成してくれる。Pythonのコードからimportできる。高速。
- Cで実装されたPythonのことで一般的に広く使われてるPythonそのものは「CPython 」と書くようでそれとは別物。
- コードを型指定などするとさらに高速にできる。
- 最初に参考にした資料 NumPyが物足りない人へのCython入門
- ライブラリ化に参考にした資料 Source Files and Compilation — Cython 0.25.1 documentation
- Cython, Pythonそれぞれのバージョンによって記述方法が違ったりするので注意。
*1:ggplot2, dplyr, reshape2, stringrなどなど https://github.com/hadley/
Dockerでデータ解析環境を作ってみようとしたらほぼ揃ってた。
Dockerを触る機会があったので試してみる。
目標はデータ解析環境の構築 PostgresqlのDBサーバと R、もしくはpython実行環境。 最終的にJupyterでブラウザから操作できたらうれしい。
。。。と思っていたらJupyter+R、Python、ついでにJuliaの環境がまるっとそろった Dockerfileがあった。
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でポチったけど開いてすらいない本がたくさんある方がいらっしゃるのでは。|д゚)チラッ
ということでこの記事では私の今年購入した本について晒して整理してみます。
消化済。読み進め中の本
- 通称:みどり本。社内の輪読会にて読了できました!
- ベイズ推定、MCMC周りの理解はこの本のおかげかも。
- コードはRとwinbugsというMCMCライブラリですが、Rstanで書きなおして写経したりしました。面倒ですが手を動かすと理解は深まりますね。
- ご存知PRMLですね。ネットで調べると「復習レーン」とか「~のための学習」みたいな情報もあったりで、私と同様苦労している方もいるみたいです。
- こちらも社内の人たちと定期的に読んでいます。みどり本に比べると結構難しいです。
- 上巻の4章が終わる辺りまで読みました。下巻が楽しみです。
- 演習問題がgithubに公開されていて iPython notebook でコードを書いてゆく形式になっています。実は原書(英語)は無料で読めます。
- さっと眺めた感じ、統計学に関する用語を体系的に理解できそう。
- 社内もくもく会(会議室で個々に黙々こなす会)が始まったのですが、初回でれず。
積み本。。
- とりあえず、5章までは読みました。
- 元々はもくもく会の題材に挙がり、コードでアルゴリズムを理解できそうという事で買ってはみたのですが、 あまりコードについて解説している内容でなかったのでもくもくは中断。もくもく会は上で紹介したThink Statsに方向転換しました。
- PRMLの上巻と内容はかぶっていますが、より数式や図が丁寧に書かれています。 私のようにPRMLでくじけそうな人はこれを読んでからだと「なるほどー」となりそう。
- 紹介した本の中では割りと最初のほうに購入した本なのですが。。
- PRMLや他の書籍で数式がわからなくなった時につまみ読みしていますが、しっかり読みいないです。
- 改めて開いてみるとLU分解とかの理論に加えて実装時のポイントも書いてあって良さそう。
- 恥ずかしなら、勢いでポチってしまった本。時系列データ分析を勉強し始めた時に買ってしまったが、 事前の知識が足りないせいか全く進まずに気づいたら積み本に。
- こちらも↑の本と一緒に買ったもの。数式厳しくてもコード書かれているのでイケるか! と思ったのですが当時は理解が足らず。。
- 改めて開いてみたらイケそうな気がしました。
まとめ
いかがでしょうか?多分まだまだPCの中やウチの本棚の中に眠っているのがあるかもしれないですが、 思い出せるところはこんなところです。
やはり 人を巻き込んで勉強しているものについては無理にでも読み進めてることができている感じがあります。 輪読会とかで担当すれば担当分の理解は深まりますし、分からなくても周りに相談できます。 逆に積んでしまったものは、誰かしら巻き込んでとっかかりを作ってしまえば良いかもしれないですね。 そして自分の知識、スキルとして昇華させるには、勉強会に参加するだけでなく自分の手を動かすのが一番だと思います。
次回は @brtriver さんです。お楽しみに!
テスト投稿
hello.