20022014 Python
遊んでみたけど結構楽しい
20022014 Python
遊んでみたけど結構楽しい
最近グラフはPandas+ggplotで描いていて、深夜のバッチ処理で毎日沢山のグラフを生成させている。
rpy2?
使ってないなーみたいな。
Python版ggplotはR版のAPIと同じものを提供することをゴールにしているのでggplotのクックブックを読んでおくといいことがあります。六角形の密度プロットとか早く実装されないかなー。
尚、下の本も参考になります。
そして、データの操作はPandasで。
機械学習はscikit-learnを使えばよい。
18012014 chemoinformatics Python
今週末の勉強会の内容です。ChEMBLダンプのimportに時間がかかるので、pythonラッパー弄りたい人はChEMBLを予め入れてから参加するといいでしょう。
当日行う手順を記しておきます。
2.7.xを入れます。OSXは標準でインストール済みです。WIndowsの場合はここからインストーラをダウンロードしてインストールしてください。
pipはPythonのパッケージ管理ツールです。
ez_setup.pyをダウンロードして実行します
sudo python ez_setup.py
その後get-pip.pyをダウンロードして実行
sudo python get-pip.py
最初にPostgreSQLのアダプタであるpsycopg2をインストールし、続いてORマッパーをインストールし、最後にChEMBLdbインターフェースをインストールします。
sudo pip install psycopg2 sudo pip install sqlalchemy sudo pip install pychembldb
pychembldbはデフォルトでMySQLを使うようになっているので.bashrcに以下のように記述しておきます。
export CHEMBL_URI="postgresql+psycopg2://localhost/chembl_17"
編集したら、新しいタブを開くかsource .bashrcをしてください(source効くのかな?)
(注)
例えばuserがpostgresでパスワードがsakeと設定している場合は
export CHEMBL_URI="postgresql+psycopg2://postgres:sake@localhost/chembl_17"
と記述します
python 対話環境を起動します
python
pythonコードを実行します(select pref_name from target_dictionary をpythonで実行)。
>>> from pychembldb import * >>> for target in chembldb.query(Target).all(): ... print target.pref_name
ターゲット名がずらずらと表示されればOKです。
14012014 chemoinformatics Python
今週末の勉強会の内容です。ChEMBLダンプのimportに時間がかかるので、pythonラッパー弄りたい人はChEMBLを予め入れてから参加するといいでしょう。
当日行う手順を記しておきます。
パッケージ管理システムです(WIndowsユーザーは飛ばしてください)。
ruby -e "$(curl -fsSL https://raw.github.com/Homebrew/homebrew/go/install)"
こんだけ。
brewを入れてあればインストールは下のコマンドを打つだけ。(WIndowsユーザーはここから最新版のインストーラをダウンロードしてください)
brew install postgresql
インストール後にデータベースを初期化します
initdb /usr/local/var/postgres
サーバー起動
postgres -D /usr/local/var/postgres
別のターミナルから動いているか確認をします
psql -l
Lionだと標準でPostgreSQLがインストールされているようで、/usr/bin/psqlが存在します。homebrewでインストールする場合には/usr/local/bin/psqlなので、
which psql /usr/local/bin/psql
とならない場合はPATHを通すか
/usr/local/bin/psql -l
と打ってください
環境変数に設定する場合は~/.bashrcに以下の行を追加します
export PATH=/usr/local/bin:$PATH
その後新しいターミナルを立ち上げた後、
psql -l
ChEMBLのftpサイトから最新版(chembl_17_postgresql.tar.gz)をダウンロードします。
展開します
tar xvfz chembl_17_postgresql.tar.gz
cd chembl_17_postgresql
PostgreSQLにChEMBL用のデータベースを用意します
psql postgres postgres=# create database chembl_17; #Ctrl-D で抜けます
ダンプをインポートします
psql chembl_17 < chembl_17.pgdump.sql
数時間待ちます。(MBAの2013バージョンだと1.5hくらいかかったそうです)
僕のMBAではこのような結果でした。(ERRORは特に問題ありません)
ALTER TABLE ALTER TABLE REVOKE ERROR: role "postgres" does not exist ERROR: role "postgres" does not exist GRANT real 44m46.001s user 0m10.153s sys 0m13.130s
$ psql chembl_17 psql (9.2.4) Type "help" for help. chembl_17=# select pref_name from target_dictionary;
と打ってターゲット名が表示されればきちんと動いています。
R逆引きハンドブックのMatrixの章をPandasで。
作者の書いた本はオススメ
>>> pd.DataFrame([[1,2,3],[4,5,6]]) 0 1 2 0 1 2 3 1 4 5 6
>>> x = pd.DataFrame([[1,2,3],[4,5,6]]) >>> pd.DataFrame([[1,2,3],[4,5,6]]) 0 1 2 0 1 2 3 1 4 5 6 >>> x = pd.DataFrame([[1,2,3],[4,5,6]]) >>> x 0 1 2 0 1 2 3 1 4 5 6 >>> x.index = list("ab") >>> x.columns = list("cde") >>> x c d e a 1 2 3 b 4 5 6
>>> x = pd.DataFrame([[1,2,3],[4,5,6]], index=list("ab"), columns=list("cde")) >>> x c d e a 1 2 3 b 4 5 6 >>> x["c"] a 1 b 4 Name: c, dtype: int64 >>> x.c a 1 b 4 Name: c, dtype: int64
Seriesが返ってくるのでメソッドもよべる
>>> x.c.mean() 2.5 >>> x.c.sum() 5
>>> x = pd.DataFrame([[1,2,3],[4,5,6]], index=list("ab"), columns=list("cde")) >>> y = pd.Series([7,8,9], index=list("cde")) >>> x.append(y, ignore_index=True) c d e 0 1 2 3 1 4 5 6 2 7 8 9
rbind
::: python >>> x 0 1 0 1 0 1 -2 3 >>> x.append(x) 0 1 0 1 0 1 -2 3 0 1 0 1 -2 3 >>> pd.concat([x, x], axis=0) 0 1 0 1 0 1 -2 3 0 1 0 1 -2 3
cbind
::: python >>> pd.concat([x, x], axis=1) 0 1 0 1 0 1 0 1 0 1 -2 3 -2 3
ggplotの組込みデータを使う。 wt>3のname,disp列を抽出
>>> from ggplot import mtcars >>> mtcars[mtcars.wt > 3][["name","disp"]] name disp 3 Hornet 4 Drive 258.0 4 Hornet Sportabout 360.0 5 Valiant 225.0 6 Duster 360 360.0 7 Merc 240D 146.7 8 Merc 230 140.8 9 Merc 280 167.6 10 Merc 280C 167.6 11 Merc 450SE 275.8 12 Merc 450SL 275.8 13 Merc 450SLC 275.8 14 Cadillac Fleetwood 472.0 15 Lincoln Continental 460.0 16 Chrysler Imperial 440.0 21 Dodge Challenger 318.0 22 AMC Javelin 304.0 23 Camaro Z28 350.0 24 Pontiac Firebird 400.0 28 Ford Pantera L 351.0 30 Maserati Bora 301.0
transform
>>> x = pd.DataFrame([(1,2),(3,4),(5,6),(7,8)]) >>> x 0 1 0 1 2 1 3 4 2 5 6 3 7 8 >>> x[2] = x[0]+2 >>> x 0 1 2 0 1 2 3 1 3 4 5 2 5 6 7 3 7 8 9
R expand.grid() function in Python
::: python >>> x 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 >>> x.sum(axis=0) 0 12 1 15 2 18 dtype: int64 >>> x.sum(axis=1) 0 6 1 15 2 24 dtype: int64
>>> x = pd.DataFrame([(1,2),(3,4),(5,6),(7,8)]) >>> x.apply(sum) 0 16 1 20 dtype: int64
>>> x = pd.DataFrame([(1,2),(3,np.nan),(np.nan,6),(7,8)]) >>> x 0 1 0 1 2 1 3 NaN 2 NaN 6 3 7 8 >>> x.dropna() 0 1 0 1 2 3 7 8
multiindex便利
>>> x = pd.DataFrame([(1,"Y"),(3,"N"),(6,"N"),(7,"Y")]) >>> x 0 1 0 1 Y 1 3 N 2 6 N 3 7 Y >>> y = x.groupby(1) >>> y.head() 0 1 1 N 1 3 N 2 6 N Y 0 1 Y 3 7 Y >>> y.mean() 0 1 N 4.5 Y 4.0
>>> x = pd.DataFrame([(1,0,1),(1,1,2),(1,2,0),(2,0,1),(2,1,1),(2,2,3),(3,0,0),(3,1,1),(3,2,2)], columns=["subject","time","conc"]) >>> x subject time conc 0 1 0 1 1 1 1 2 2 1 2 0 3 2 0 1 4 2 1 1 5 2 2 3 6 3 0 0 7 3 1 1 8 3 2 2 >>> x.pivot(index="time", columns="subject") conc subject 1 2 3 time 0 1 1 0 1 2 1 1 2 0 3 2
groupby
>>> x = pd.DataFrame([(1,0,1),(1,1,2),(1,2,0),(2,0,1),(2,1,1),(2,2,3),(3,0,0),(3,1,1),(3,2,2)], columns=["subject","time","conc"]) >>> x subject time conc 0 1 0 1 1 1 1 2 2 1 2 0 3 2 0 1 4 2 1 1 5 2 2 3 6 3 0 0 7 3 1 1 8 3 2 2 >>> x.sort("time") subject time conc 0 1 0 1 3 2 0 1 6 3 0 0 1 1 1 2 4 2 1 1 7 3 1 1 2 1 2 0 5 2 2 3 8 3 2 2
R逆引きハンドブックのMatrixの章をPandasで。
Pandasの場合MatrixないからDataFrameだけど。
行列ではなくデータフレーム
>>> x = pd.DataFrame([[1,0],[-2,3]]) >>> y = pd.DataFrame([[-1,1],[4,2]]) >>> x.dot(y) 0 1 0 -1 1 1 14 4 >>> x * y 0 1 0 -1 0 1 -8 6
x %o% y はわからない
逆行列もnumpyに頼る感じ
applyでaxisで行か列かを選択する。applyはよく使う
>>> x 0 1 0 1 0 1 -2 3 >>> x.apply(sum, axis=0) #colsum 0 -1 1 3 dtype: int64 >>> x.apply(sum, axis=1) #rowsum 0 1 1 1 dtype: int64
numpyのarrayに
>>> x 0 1 0 1 0 1 -2 3 >>> x.as_matrix() array([[ 1, 0], [-2, 3]], dtype=int64)
DataFrameなので
>>> x 0 1 0 1 0 1 -2 3 >>> x.index Int64Index([0, 1], dtype=int64) >>> x.columns Int64Index([0, 1], dtype=int64) >>> x.index = list("ab") >>> x.columns = list("cd") >>> x c d a 1 0 b -2 3
>>> x.shape (2, 2)
>>> x 0 1 2 3 0 1 2 3 4 1 5 6 7 8 2 9 10 11 12 3 13 14 15 16 >>> x.iloc[[2],[3]] 3 2 12 >>> x.iloc[1:4,[3]] 3 1 8 2 12 3 16
rbind
concatで行か列を指定する。これもよく使う
>>> x 0 1 0 1 0 1 -2 3 >>> x.append(x) 0 1 0 1 0 1 -2 3 0 1 0 1 -2 3 >>> pd.concat([x, x], axis=0) 0 1 0 1 0 1 -2 3 0 1 0 1 -2 3
cbind
>>> pd.concat([x, x], axis=1) 0 1 0 1 0 1 0 1 0 1 -2 3 -2 3
>>> pd.DataFrame(np.diag(range(4))) 0 1 2 3 0 0 0 0 0 1 0 1 0 0 2 0 0 2 0 3 0 0 0 3
>>> x 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 >>> pd.DataFrame(np.triu(x.as_matrix())) 0 1 2 0 1 2 3 1 0 5 6 2 0 0 9 >>> pd.DataFrame(np.tril(x.as_matrix())) 0 1 2 0 1 0 0 1 4 5 0 2 7 8 9
>>> x 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 >>> x.T 0 1 2 0 1 4 7 1 2 5 8 2 3 6 9
>>> x 0 1 2 0 1 2 3 1 4 5 6 2 7 8 9 >>> x.sum(axis=0) 0 12 1 15 2 18 dtype: int64 >>> x.sum(axis=1) 0 6 1 15 2 24 dtype: int64 >>> x.sum(axis=0).sum() 45
固有値分解
>>> x 0 1 0 4 1 1 1 4 >>> pd.DataFrame(np.linalg.eig(x.as_matrix())[1]) 0 1 0 0.707107 -0.707107 1 0.707107 0.707107
特異値分解は知らん
pandas本はpandasの話がメインなので逆引きがないのが辛いかなと思う。pandasに慣れると手放せないけど☆
というわけで、R言語逆引きハンドブックのベクトルの章をPandasでやってみた。
n = pd.Series(range(1,10)) n.apply(lambda r: "ID " + str(r))
f = pd.Series(["y","n","y","n","n"]) pd.factorize(f) (array([0, 1, 0, 1, 1]), array(['y', 'n'], dtype=object))
Why does pandas (python library) has no factor like variable?に書かれている
as.logicalに対応するものはない?
pd.Series([True, False, True, True])
>>> r = pd.Series(range(11)) >>> l = r[r > 5] >>> l.sum() 5 >>> l.any() True
which?
>>> l[l == True].index Int64Index([6, 7, 8, 9, 10], dtype=int64)
>>> pd.Series([]) Series([], dtype: float64)
length(x) <- 10
みたいにサイズを増やすことはできない?
減らすのは
>>> a = pd.Series(range(10)) >>> a[:5] 0 0 1 1 2 2 3 3 4 4 dtype: int64
>>> a = pd.Series(range(5), index=list("abcde")) >>> a a 0 b 1 c 2 d 3 e 4 dtype: int64 >>> a["c"] 2
>>> a = pd.Series(range(5), index=list("abcde")) >>> a[list("ace")] a 0 c 2 e 4 dtype: int64 >>> a[[0,2,4]] a 0 c 2 e 4 dtype: int64 >>> a[(a<1)|(a>3)] a 0 e 4 dtype: int64
indexを使う
>>> a = pd.Series(range(5)) >>> a[(a<1)|(a>3)].index Int64Index([0, 4], dtype=int64)
>>> import numpy as np >>> a = pd.Series(range(5)) >>> a.reindex(np.random.permutation(a.index)) 2 2 0 0 3 3 1 1 4 4 dtype: int64 >>> b = a.reindex(np.random.permutation(a.index)) >>> b.sort() >>> b 0 0 1 1 2 2 3 3 4 4 dtype: int64
>>> a = pd.Series(range(5)) >>> a 0 0 1 1 2 2 3 3 4 4 dtype: int64 >>> a[(a<1)|(a>3)] = 10 >>> a 0 10 1 1 2 2 3 3 4 10 dtype: int64
>>> a = pd.Series(range(5)) >>> a.append(pd.Series([0,0,0,0])) 0 0 1 1 2 2 3 3 4 4 0 0 1 0 2 0 3 0 dtype: int64
>>> a = pd.Series([1,2,3,4,5,4,6,3,2]) >>> a.duplicated() 0 False 1 False 2 False 3 False 4 False 5 True 6 False 7 True 8 True dtype: bool >>> a[a.duplicated()] 5 4 7 3 8 2 dtype: int64
>>> a.drop_duplicates() 0 1 1 2 2 3 3 4 4 5 6 6 dtype: int64
R逆引きハンドブックは手元に置いておくと重宝する☆
26112013 Python
最近コードは書いてるけどブログを書く気力が減少中なので、いい加減な文章とともに3つほど載せておきます。
僕の中ではプログラミング言語製のスクリプトを読むのと自然言語のスクリプトを読むのは競合するらしい。
ライフサイエンス系のライブラリをデモしにきた方がCanopyを使っていて興味をもった。IPython Notebookとくらべてどうなんだろうか?
PythonScriptの名前が変わっていた。そして結構機能強化されているらしい。PythonScriptをフォークしていたので作者からアナウンスされ知った。今度試してみようかな。
D3.jsっぽいのをPythonでかけるらしい。これはggplotなみにときめいた。
参加したみなさまお疲れ様でした。色々な話が聞けて楽しかったです。
僕のスライド
静岡おでん美味い
富士山タジン鍋
来年は午年と巳年ではなくなってしまいますが、Shizuoka.pyは引き続き開催していければと思っていますので、皆さんでまたネタを持ち寄ってワイワイと楽しくやりましょう☆
08112013 Python
巳年ということではじめたShizuoka.pyも3回目となりました☆
懇親会は静岡おでんのお店にする予定です。懇親会の人数を大体把握したいので参加予定の方はお早めに登録して頂けると嬉しいです。少なかったらディープな方面をはしごするのもいいかなと思っていますので
僕はPhantom.jsをpythonから使ってゴニョゴニョする話をする予定です。
今回は機会学習系のトークが2つで、pandasとかggplotのはなしもあるそうなので楽しみ。
今のところ30分くらいのトークの空きがあるので、なにか話したいヒトはconnpassのコメント欄に書き込むか私までリプライを下さい
もし埋まらなければ、PyconAPACで話した内容を話そうかなと思っています。