Hatena::ブログ(Diary)

TRYal and error

2017-10-18

Pandasで全て欠損値(NaN)の行を除く

特定のカラムを除いた後にすべて欠損値の行ができてしまうと後の解析でエラーを吐く可能性があるので取り除いておきたい場合がある。

frame.ix[frame.notnull().any(axis=1), :]

を使う。
isnull(), notnull()の出力を、all(), any()をaxisとともに組み合わせて他にも色々できる。

>>> import pandas as pd
>>> import numpy as np
>>> a = [[np.nan, np.nan], [np.inf, 1.0]]
>>> frame = pd.DataFrame(data=a, index=[0,1], columns=[0,1])
>>> frame
     0    1
0  NaN  NaN
1  inf  1.0
>>> frame.isnull()
       0      1
0   True   True
1  False  False
>>> frame.isnull().all(axis=1)
0     True
1    False
dtype: bool
>>> extract = frame.ix[frame.notnull().any(axis=1), :]
>>> extract
     0    1
1  inf  1.0

2017-10-10 PyMC3 pm.sample()でAttributeErrorが出る

Traceback (most recent call last):
  File "test_pymc.py", line 18, in <module>
    trace = pm.sample(niter, step, start)
  File "pymc3/sampling.py", line 224, in sample
    init = init.lower()
AttributeError: 'dict' object has no attribute 'lower'

pipでバージョンを指定せずに導入したのでPyMC3のバージョンは3.1だった。
とりあえずの解決策はPyMC3のバージョンを3.0にダウングレードすること。

python -m pip install pymc3==3.0

もう一つの解決策はpm.sample()の引数の書き方を変えること。

trace = pm.sample(niter, step=step, start=start, init='ADVI')


PyMCについて詳しくないので適当に調べた経緯を以下に。
https://github.com/pymc-devs/pymc3/issues/2357
Git-hubのissueで開発者が一方的にコメントしClose、解決したかのようになっているが、実際にはpm.sample()の書き方によってはエラーが残る。
https://qiita.com/yadoyado128/items/e4a8d8fa23ec76473d5c
で紹介されているように

trace = pm.sample(niter, step, start)

と書くとv3.1ではエラーが出る。v3.0ではそのまま動く。
issueで指摘されているようにinit='ADVI'などと入れたい場合、

trace = pm.sample(niter, step=step, start=start, init='ADVI')
or
trace = pm.sample(draws=niter, step=step, start=start, init='auto')

などのように別の書き方が必要。これならv3.1でも動く。
http://docs.pymc.io/api/inference.html?highlight=metropolis#module-pymc3.sampling
(公式Documentより)
3.0 => 3.1 でどうしてここまで変わるのか……

2017-10-09 qsubでlocal installしたツールを叩く

qsubで計算クラスターにジョブを投げる際、ローカルインストールしたツールを叩きたい時がよくあります。
いままでは何も考えずにスクリプトに直接絶対PATHを書いていたのですが、
ツールによってはその内部でPATHに通っている別のプログラムを呼び出しているものがあります。

例えばPerlスクリプトで個別のPerlスクリプトまとめたパイプラインツールの場合、
モジュールを一通りインストールし、満を持して

#/bin/bash
~/local/bin/perl script.pl

と叩くと、それ自体はローカルインストールしたPerlによって呼び出されますが、その中で叩かれている別のスクリプトは計算サーバPATHPerlで実行されてしまいます。

言われてみれば当たり前なのですが、気づかないとなんでエラーが出てるのかわからんということがあります(ありました)。
個別のスクリプトPATHを直書きしてなんとかしたあとに気づいたのですが(アホ)、

#/bin/bash
PATH=~/local/bin:$PATH
perl script.pl

としておけば、qsubを投げた場合でも常に自分のlocalのツール群が呼び出されるのでいいですね。
同様に、常にWorking directoryにcdしておいてもいいと思います。たまに変なバグが出るので。

2017-10-05

PyenvのAnacondaでインストールしたモジュールがインポートできない(解決)

$ pyenv install anaconda2-4.2.0
$ conda install foo
$ python

Python 2.7.12 |Anaconda 4.2.0 (x86_64)| (default, Jul  2 2016, 17:43:17) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://anaconda.org
>>> import foo
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named foo

PyenvにAnacondaまで組み合わさってPATHが複雑になってるのかと思ったが、sys.pathで確認しても問題はなさそうだった。

$ which conda

これで確認したところ、もともと(Pyenv外に)入っていたAnacondaが読まれていただけだった。

~/.pyenv/shims/conda install foo

解決

2014-02-26

動画まとめ

aLeavesは最終確認をしてもらっているので上がりませんがもう全部できています。

Arabidopsis eFP Browser でシロイヌナズナの遺伝子発現情報を見る 統合TV(togotv)|生命科学系DB・ツール使い倒し系チャンネル
こっちは上がった