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

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

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

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

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

追記:
strが含まれていると、型がうまく反映されず、np.nanが"nan"になってしまうことがある。
この場合isnull()がすべてFalseを吐く。以下のようにアドホックに置換するのが一つの解。

df.replace("nan", np.nan).isnull()

以下検証。

>>> a = np.array([[np.nan, np.nan],[np.nan, 1],[1,1]])
>>> df = pd.DataFrame(data=a, index=[0,1,2], columns=[0,1])
>>> df.isnull()
       0      1
0   True   True
1   True  False
2  False  False
>>> a = np.array([[np.nan, np.nan],[np.nan, "aaa"],["aaa","aaa"]])
>>> df = pd.DataFrame(data=a, index=[0,1,2], columns=[0,1])
>>> df.isnull()
       0      1
0  False  False
1  False  False
2  False  False
>>> df
     0    1
0  nan  nan
1  nan  aaa
2  aaa  aaa
>>> df.replace("nan", np.nan)
     0    1
0  NaN  NaN
1  NaN  aaa
2  aaa  aaa
>>> df.replace("nan", np.nan).isnull()
       0      1
0   True   True
1   True  False
2  False  False

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 でどうしてここまで変わるのか……

qsubでlocal installしたツールを叩く

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

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

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

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

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

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

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

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

で解決。

動画まとめ

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

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

aLeave MAFFT 3

苦情 要請が来たので修正しました。

系統樹推定についてよくわかっていなかったらしく、MAFFTサーバに渡してからの作業が結構適当だったようです。

BLASTで相同性検索をして取ってきたデータを元にして作ったtreeはguide treeというようで、これは系統樹とは言わないそうなんです。ここからマルチプルアラインメントを作成し、NJ法などの計算を経たものを系統樹と呼ぶらしいです。

そして撮り直しから編集まで一往終了しました。
h_onoさんにチェックしていただく動画が2つたまっているので早くあげたいです……。

あとJavaの調子が悪くて直すのに時間がかかりました。古いバージョンのJavaをアンインストールしないと不具合が出るみたいです。他のPCでも確認したほうがいいかも。

Arabidopsis eFP Browser 2

一通り編集も終わって原型ができてしまったのですが、h_onoさんが不在だったためうpは次回になりそうです。
ということでこのブラウザの特徴を言葉で書いていこうと思います。(前回消えたやつや)

・遺伝子のIDを入力することで、その遺伝子発現量を見る。
・イラストに色がついた形で、見やすく表示される。
・発現量は、 "Data Source" をいじることで組織別、ステージ別、与えたストレス別、標準化方法別に見ることができる。
・"Mode"が3種類あり、 "Absolute" は絶対発現量を表示し、 "Relative" は最大の発現量の部分と最低の発現量の部分の間のグラデーションが赤から青まで最大のコントラストで変化するように倍率で表示し、"Compare"は2つの遺伝子IDを入力することによりその差を倍率で表示する。
・詳細に数値が知りたい場合は、データテーブルやチャート図を表示することもできる。

"Absolute" は標準化の方法が同じであれば他の "Data Source" と比べることもできるかもしれません。 "Relative" は全体的に発現量が高いとか、低いとか、差が見にくい場合や、foldの値をみたいときに用いると良いです。Compareが一番実用的で、ハウスキーピング遺伝子などと比較することにより、別の実験データとの比較もしやすくなります。

チケット発行者のiNutさんとお話もしました。

使う上での注意点は、目的の遺伝子IDがわかっていないといけないということです。例えば、「成形の葉で特異的に発現している遺伝子を探す」ということはできません。あくまで自分の知りたい遺伝子が分かっている状態で、その機能が不明なのであれば転写因子などと比較して目星をつける、あるいは他種の植物から採った自分の実験データをホモログのデータと照らし合わせるなどという使い方になるでしょうか。