バイオインフォマティクスってかっこいい

完全wetな研究室でdryに興味が出てしまったB4 のBlogです。最近は仮想通貨、ブックメーカーとかにも興味がある悪い子です。

Selenium備忘録

今友達からbed365 というサイのスクレイピングを任されている。ブックメーカーで有名なサイトだ。ここのデータを集めて解析したいらしい。

スクレイピングでは基本ChromeDriverを使って行っているのだが、久しぶりに動かしたら、以下のようなエラーが度々表示された。

[2084:15336:0122/010511.788:ERROR:process_metrics.cc(105)] NOT IMPLEMENTED

スクレイピング自体はできていたからそんなに気にしていなかったのだが、そろそろ気になってきたので調べてみた。

github.com

これだ。。

Seleniumの問題じゃなくChromeの問題らしい。v63でのバグだとか。。

このissueでは、v62に変更することが推奨されている。

古いChromeは以下から入手できる。
https://www.slimjet.com/chrome/google-chrome-old-version.php

v63アンインストール。

v62 インストール。


なおった

IPython データサイエンスクックブック memo (2)

2.4 Workflow using git branch

git stash

commitしていない変更の一時退避

git stash pop

変更を戻す

2.5 High reproductivce, interactive computing

  • ファイルの命名規則ディレクトリ構造を一貫性のあるものにする。
  • 全てのソフトウェアスタックの正確なバージョンを記録する
  • dill, Joblibの利用。JoblibはNumpyにも配したメモ化パターンが存在。
  • pararell, multiprocessing, Joblibなどの並列計算ライブラリを使った並列化の検討

2.6 High quality python code

  • assert の組み込み
  • クラスはなるべく避ける
  • 関数の引数にはキーワード引数を。

2.7 Unit test using nose

%%writefile -a [file]

でファイルに追記可能。

test_xxx.py モジュールをxxx.py モジュールに付随させる

テスト開始時:setup()
終了時:teardown()
テストを始める前と終了した後で環境が変わらないようにする。

nosetests

で実行

2.8 debug with IPython

script.pyっでインポートされているextscript.pyの20行目にブレークポイントを設定し、デバッカ制御下でscript.py実行

%run -d -b extscript.py:20 script

コマンドラインPythonスクリプトとして実行されるようになっている、GUIに統合されている、等の場合は

from IPython import embed
embed()

を組み込めば、そこでIPythonデバッガが起動する。

IPython データサイエンスクックブック memo (1)

1.1 Introduction

%%writefile

IPython magicコマンド。テキストファイルの作製。

インラインの数式は$...$ を使って記述。
独立した数式は $$...$$ を使って記述。

HTML()SVG()YouTubeVideo()

nbviewerを使ってIPythonで生成したJSONテキストを公開可能。

1.2 Data Analysis with IPython

df = pd.read_csv(url, index_col='Date', parse_dates=False, dayfirst=False)
  • pase_dates
    01/01/2013 → 2013-01-01
  • dayfirst
    2013-02-01 → 2013-01-02
df.describe()

サマリー表示

days = np.array(['Monday', 'Tuesday', 'Wednesday', 
                 'Thursday', 'Friday', 'Saturday', 
                 'Sunday'])
df['Weekday'] = days[df.index.weekday]

number → names

df_week.ix[days].plot(lw=3, figsize=(6,4));

-lw
line width - figsize figure size

.ix で行っているのは並べ替えのみ。

1.3 Numpy

%precision 3

ipython のmagicコマンド。数値出力を第3位までに。

n = 10000
x = [random.random() for _ in range(n)]
y = [random.random() for _ in range(n)]
%\time it [x[i] ; y[i] for i in range(n)]
1 loop, best of 3: 250 ms per loop
  • %timeit
    実行時間の計測。複数回実行、最速の実行時間を表示。
%timeit sum(x)  # pure Python
%timeit np.sum(xa)  # NumPy
The slowest run took 25.57 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 6.69 ms per loop
The slowest run took 59.18 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 1.53 ms per loop

numpy使うとこのくらい早くなる。

x[:1000,None]

Noneを使えば次元を増やせる。

1.4 custom magic command

from IPython.core.magic import (register_line_magic, 
                                register_cell_magic)
  • register_line_magic
    行magicコマンドの定義
  • register_cell_magic 列magicコマンドの定義
def load_ipython_extension(ipython):
    ipython.register_magic_function(function, 'cell')

この関数を組み込んでおけば実行時に読まれてmagicコマンドとして登録される。 IPython のInteractiveShellインスタンスを引数に受け取る。

cythonmagicrmagic

cython の関数をセル内で定義、インポート可能。

1.5 Interactive computing

定義したmagicコマンドの引数の指定

  • ipython実行時に指定
ipython --profile=cookbook --RandomMagics.text='Your number is {n}.' --RandomMagics.max=10 --RandomMagics.seed=1
  • 設定ファイルで設定 ~/.ipython/profile_default_ipython_config.py を編集
c.RandomMagics.text = 'random{n}'

Configurableクラス > 設定ファイル  いずれも継承可能

1.6 IPython Kernel

IPythonでカーネルを作ることができる。用途:IPythonのユーザーインターフェースを書き換える。

IPython version5.1.0 ではカーネルの起動の仕方がわからなかった。要調査。

日常 Part2

修士をとるか、就職か

修士に行くか、就職してしまうか。

修士に行く場合、今の研究をあと二年続ける。 就職する場合、今のインターン先に就職する。二年もあれば、多分転職する。

理系なら誰しも少しは考えるだろう。本来院試前に考えることだ。 院試を受けたことは生物学のおさらいになったので全然後悔なんてしていない。

でもここにきて、自分がやりたいことってやっぱりdryで、wetはもういいんじゃないか、自分には向いてない上に今後のキャリアのことを考えると今の研究は役に立たないのではないか。 そう思ってきたのだ。

人生楽しい方にしか進んできていない。何不自由ない育て方をされてきているので(親には最大限の感謝をしている)、今の今まで好きなことを勉強し、好きに生きることができている。

今回の悩みもそのせいだ。欲が出ている。中途半端にwetの研究するくらいなら、いっそやめてしまった方がよいのではないのだろうか。とか。

何が問題か

wetの実験の何が嫌って、Technicalなミスのせいで数十時間かかる実験の結果が信頼できなくなることだ。

要は問題は2つ。

  • 自分はそんなしっかりしてない
  • 自分はそんな器用でない

そんなしっかりしてないというのは、実験においては大問題だ。 培養時間を、2-3時間くらい違くてもいいや。とか、思ってしまうのである。 そんな科学者存在してはいけない。

器用でないというのも、致命的だ。
単純に、ミスるからだ。 wetの実験って、全部自動化すべきだと思うんだ。Westerblottingとか。

そんなこと考えてしまう時点で向いてない気がする。

そもそもなぜ今の研究室(がっつりwet)に入ったかというと、

  • データ解析前の、データをとってくる段階を知る必要があると感じたため。
  • オートファジー、面白そう。

このくらいなのである。あまり未練はない。

なんにせよこのままではいけない。

相談しよう

ということで、相談した。相談とかするキャラじゃないケド。

友達は多いが信頼を置いている人は2,3人しかいない。
皆そんな感じだろう。
自分の場合、直属の上司に心から信頼を置いてしまっている。 次に元カノだ。今カノはいない。

ということでこの二人に聞いた。

上司A

いやAしかいないのだけど。

1年くらいの付き合いで、よくご飯に連れて行ってくれる。大好きな上司だ。

正直今のインターン先に行きたくなっているのはこの上司による影響が大きい。

強Pushしてくれる。ただこの人は博士課程までいき、ファーストの論文を3本持っている。

すごい。 それでこのキャリアで満足しているのはすごい。

社員全員、もっとビッグになれるのにと思う。

この方は、実際にベンチャーで勤めている立場として、とても親身に相談に乗ってくれた。 あくまで、社員としてでなく、一個人として。

修士をとることのメリット、デメリット。
20代後半までにどうなっていたいか。
スキルアップを重視した際どうすべきか。

元カノA

いやBもいるのだけど。

東大の建築学部でとても頭がよい。 論理的思考力がある。

相談というのは難しい。結局のところ自分の中では結論が出ているので、そういう場合は、その結論へ向かうよう後押しするのがよい。
あみだくじで決めてしまえばよい。
おいしいサンドイッチの作り方とは

相談とは。みたいな相談になってしまった。いちいち頭がよい。 なぜかおいしいサンドイッチの作り方に話が落ち着いた。

そのあとなんか恥ずかしくなってきたという連絡も来た。 相談乗るときにカッコつけなくていいから。

結論

これを書いている間に、まだ研究も頑張れるのではないかと思ってしまった。
大学の近くで2年契約のマンションに住んでしまっていることも考慮に入れなくては。

優柔不断な癖を直したいが、人生に関わってくる決断だし、もう少し悩もうと思う。卒論を書きながら。

日常 Part1

30分前に気づいた。今日はもう30分しかないということを。
毎日更新するんだ。今度こそ。

最近はOreillyの本をひたすら読み進めている。

いまは下記の2冊をソースコードとともに楽しんでいる。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Oreillyの本は、かっこいい。所有欲が満たされる。
持っているだけで満足してしまう。
だが今回は違うのだ。割とまじで勉強すると決めたのだ。

目標はKaggleの問題を解く。それだけ。
あとは長期的な目標として、会社で今後蓄積されていくであろう遺伝データに適用することでなんかできないかなとも思っている。

にしてもとても分かり易い。Deep LearningのDの字も知らない自分でもサクサク読める。さすが良書と言われているだけある。

あと、IPythonってなんか毛嫌いしてたけど、やっぱいい。パラメーターちょいちょい変えながら実行したいみたいな時には最高のツールだと思う。

下の本はあと2日、上はあと10日で終わらせよう。

明日も明後日も明々後日も休みっていいね。こってり勉強しよう。

Twitterを始めた。

恥ずかしい。

なにが恥ずかしいかって、Twitterをいまさら始めたことじゃない。
これはアカウントを分けただけで、今Twitterを始めたわけじゃない。

過去の記事が恥ずかしい。


だいぶ消した。大幅に消した。

心機一転、 new kimoton で頑張ろう。年も明けたことだし。

バイオインフォのブログに変えてしまおう。年も明けたことだし。

ということで、今年からよろしくお願いします。




P.S.
Twitter、無言フォローしてすみません。
すごい人を見るとフォローしたくなっちゃうんです私。

repr()、str()、eval() のお話

Biopython Tutorial and Cookbookの和訳を行ってる最中。

>>> from Bio import SeqIO
>>> for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
...     print(repr(seq_record.seq))

Seq('CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC', IUPACAmbiguousDNA())
・
・
・
Seq('CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC', IUPACAmbiguousDNA())

FASTAファイルを読んで配列を出力する際にreprを使っている。 ただの.seqだと

>>> for seq_record in SeqIO.parse("ls_orchid.gbk", "genbank"):
...     print(seq_record.seq)

CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGATGAGACCGTGG...CGC
・
・
・
CATTGTTGAGATCACATAATAATTGATCGAGTTAATCTGGAGGATCTGTTTACT...GCC

配列だけが返される。


つまり、reprのおかげでSeqオブジェクトが保たれている。

そもそもreprをよく知らなかったので、調べてみた。
ちょっと調べた感じだとstr()とそんな変わらない??

オブジェクトの印字可能な表現を含む文字列を返します。これは型変換で得られる (逆クオートの) 値と同じです。通常の関数としてこの操作にアクセスできるとたまに便利です。この関数は多くの型について、 eval() に渡されたときに同じ値を持つようなオブジェクトを表す文字列を生成しようとします。そうでない場合は、角括弧に囲まれたオブジェクトの型の名前と追加の情報 (大抵の場合はオブジェクトの名前とアドレスを含みます) を返します。クラスは、 repr() メソッドを定義することで、この関数によりそのクラスのインスタンスが返すものを制御することができます。

引用:2. 組み込み関数 — Python 2.7.14 ドキュメント

x = 'foo'
In [1]: x = 'foo'
In [2]: repr(x)
Out[2]: "'foo'"

In [3]: str(x)
Out[3]: 'foo'

引用:
[https://stackoverflow.com/questions/7784148/understanding-repr-function-in-python:title]

違った。eval()と一緒にご紹介。

  • eval(x)
    与えられた引数がPython 式 (技術的にいうと、条件のリスト) として解析され評価される。実行したいコマンドを文字列にして引数に与える。
    下の場合だと、fooインタプリタで実行した返り値を返す。fooなんて変数は定義されてないからエラーになる。

    >>> eval('foo')
    Traceback (most recent call last):
      File "<pyshell#5>", line 1, in <module>
       eval('foo')
      File "<string>", line 1, in <module>
    NameError: name 'foo' is not defined
    

    'foo'インタプリタで実行した値がほしい場合は

    >>> eval("'foo'")
    'foo'
    

    とすればよい。

  • repr(x)
    xのマジックメソッド__repr__を呼び出す。 基本的にeval()の逆version。インタプリタで実行したときに印字可能な表現を返すような値を返すような値を文字列にしたもの。文字列にしたものである。
    python >>> x = 'foo' >>> repr(x) "'foo'" そしたらこんな感じでダブルクオートで囲まれることになる。

  • str(x)
    xのマジックメソッド__str__を呼び出す。

    >>> x = 'foo'
    >>> str(x)
    'foo'
    


Biopythonの例ではseq_record.seq.__repr__Seqオブジェクトを返すようになっているってだけぽい。

参考

Understanding repr( ) function in Python - Stack Overflow