大志を抱く少年記

野心だけはいっちょ前な理系大学院生のブログです。

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.13 ドキュメント

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。インタプリタで実行したときに印字可能な表現を返すような値を返すような値を文字列にしたもの。文字列にしたものである。

    >>> 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

ベン図の上限

Rでベン図を描く。

VennDiagramというライブラリが使いやすくて視覚的にもわかりやすかった。 今回6つのデータセットをベン図にplotする必要があったので、6つのベン図ってなんだよと思いつつ、実行してみたら、普通にエラーが出た。VennDiagramの上限は5つまでらしい。
5つをPlotしたのが以下。とても分かりやすい。見やすい。

f:id:kimoppy126:20170901104132p:plain

コードは以下。

library(VennDiagram)

# グループを準備
a <- read.csv('Sample1.csv')
data1 <- as.vector(a$id)
b <- read.csv('Sample2.csv')
data2 <- as.vector(b$id)
c <- read.csv('Sample3.csv')
data3 <- as.vector(c$id)
d <- read.csv('Sample4.csv')
data4 <- as.vector(d$id)
e <- read.csv('Sample5.csv')
data5 <- as.vector(e$id)

# データをリスト型に変換
data <- list("Sample1" = data1, "Sample2" = data2, "Sample3" = data3, "Sample4" = data4, "Sample5" = data5)

# Plot
pdf("Benn.pdf")
venn.diagram(data, filename="Benn.jpg", fill=c(2,3,4,5,6), alpha=0.4, lty=1)
dev.off()



6つ以上plotしたいときは、venn というライブラリを使うとできる。7つまでできる。


f:id:kimoppy126:20170901105817p:plain

引用:r - Nice looking five sets Venn diagrams - Stack Overflow

コードは以下。データの準備は上と同様なので省略する。

library(venn)
data <- list("A" = data1, "B" = data2, "C" = data3, "D" = data4, "E" = data5, "F" = data6, "G" = data7)
pdf("Benn.pdf")
venn(data, ilab=TRUE, zcolor = "style")
dev.off()

重複データの抽出にはintersectを使う。

dup <- intersect(intersect(intersect(intersect(intersect(data1, data2), data3), data4), data5), data6)

出力はpdfにして
レポートに載せるときはスクショ撮ってるんだけど、もっといい方法ないんかな。。

参考 r - Nice looking five sets Venn diagrams - Stack Overflow

nCr をpython で書くと。。


{}_nC_r = \frac{n!}{(n-r)!r!}

つまりn個からr個取り出す組み合わせというやつ。
これをPythonで書きたい。
そんなときは高階関数reduceを使う。

import operator as op
def ncr(n,r):
    r = min(n-r,r)
    if r == 0: return 1
    num_over = reduce(op.mul, xrange(n, n - r, -1))
    num_under = reduce(op.mul, xrange(1,r + 1))
    return num_over // num_under

lambda式でも書くなら、、

reduce(lambda x, y: x * y, xrange(n, n - r, -1))

みたいに書く。

MkDocs 使ってみた。

昨日任された業務を紹介しよう。

Web上でパワポの内容をWebページで見れるようにして!

というものだ。
こんなとき、MkDocsがとても便利。

MkDocsの公式に飛ぶ。 f:id:kimoppy126:20170708094043p:plain

サイト自体がMkDocsで作られてる。 こんなページがMarkdownでお手軽に作れるのがMkDocs。 いちよPythonのアプリだけどPythonでコーディングするわけじゃない。

インストー

動作環境

MkDocs supports Python versions 2.6, 2.7, 3.3, 3.4, 3.5 and pypy.

を満たしていればOK

pipのインストー

pipはデフォルトでインストールされているはずだが、ない場合や古い場合、インストールが必要。

  • pipをすでにインストール済みの場合。
    以下のコマンドでアップデート

    pip install --upgrade pip
    
  • インストールしてない場合。
    get-pip.pyをダウンロードして以下のコマンド

    python get-pip.py
    

MkDocsのインストー

pipを使ってMkDocsをインストールする。

pip install mkdocs

$ mkdocs --version
mkdocs, version 0.15.3

Windowsを使っている場合

python -m pip install mkdocs
python -m mkdocs

Webページの構築

mkdocs new my-project
cd my-project

Getting started is super easy.

super easyですね。
mkdocs.ymlというconfigファイルとdocsというドキュメントのソースファイルを入れるファイルが作られます。docsにはデフォルトでindex.mdが入ってます。MkDocsはビルドインのサーバーなので、ドキュメントを作りながらWeb上でどう表示されるのか見ることができる。
mkdocs.ymlと同じディレクトリ上で、以下のコマンドを打つと、サーバーが立ち上がる。

$ mkdocs serve
INFO    -  Building documentation...
INFO    -  Cleaning site directory
[I 160402 15:50:43 server:271] Serving on http://127.0.0.1:8000
[I 160402 15:50:43 handlers:58] Start watching changes
[I 160402 15:50:43 handlers:60] Start detecting changes

適当なWebブラウザでhttp://127.0.0.1:8000/にアクセスすると、f:id:kimoppy126:20170708101048p:plain
こんな感じでデフォルトのホームページが見れる。

MkDocsはオートリロードに対応しているので、mkdocs.ymldocs内のファイルに変更を加えるとすぐにWeb上に反映される。

ドキュメントの追加

docs/ディレクトリに.mdファイルを追加することに加え、mkdocs.ymlを編集する必要がある。しなくても自動で読み込まれるが、アルファベット順で並べられるため、ドキュメントの順番を指定したい場合は編集する。
最上位の階層に2つのページを追加する場合、以下のように編集する。

pages:
- 'index.md'
- 'about.md'

このままではディレクトリの名前がページの名前として認識され、docs/index.mddocs/about.mdページが追加される。

自分で指定した名前をページに与えたい場合は以下のようにする。

pages:
- Home: 'index.md'
- About: 'about.md'

階層を持った構造にしたい場合

以下のようにセクションタイトルの下に関連ページを並べれば、サブセクション構造を持ったページが作られる。

pages:
- Home: 'index.md'
- User Guide:
    - 'Writing your docs': 'user-guide/writing-your-docs.md'
    - 'Styling your docs': 'user-guide/styling-your-docs.md'
- About:
    - 'License': 'about/license.md'
    - 'Release Notes': 'about/release-notes.md'

ドキュメント中に画像やgithubのページを含めたい場合

docs/以下のディレクトリに適切に配置すればよい 例えばGithubCNAREファイル、PNGフォーマットのscreenshot.png画像を追加したいとき、ファイルのレイアウトを以下のようにする。

mkdocs.yml
docs/
    CNAME
    index.md
    about.md
    license.md
    img/
        screenshot.png

あとはドキュメント中にマークダウン記法で書けばいいだけ。

Cupcake indexer is a snazzy new project for indexing small cakes.
![Screenshot](img/screenshot.png)
*Above: Cupcake indexer in progress*

テーマの設定

ドキュメントをどう表示させるか(サイトの見た目)を変更する場合、 mkdocs.ymlファイルを編集し、themeを設定します。

site_name: MkLorum
pages:
    - Home: index.md
    - About: about.md
theme: readthedocs

theme: readthedocsに設定すると、こんな感じ。

f:id:kimoppy126:20170708110548p:plain

ビルドインのテーマはmkdocsreadthedocsしかないぽいけどサードパーティーにはいい感じのが結構ありそう

サードパーティーのテーマは以下から入手可能
MkDocs Themes · mkdocs/mkdocs Wiki · GitHub

テーマのカスタマイズに関しては以下を参考に
Styling Your Docs - MkDocs

Templateの利用

ある程度整ったTemplateが配布されてたりする。 Templateから作った方が、いろいろ勝手がわかりやすい。

GitHub - BPA-CSIRO-Workshops/btp-manuals-md: This contains all material for Markdown version of BTP workshops

HTMLへの出力

Markdownで作ったファイルをHTMLに出力できる。mkdocs.ymlと同じディレクトリで、

mkdocs build

これにより新しくsiteディレクトリが作られる。

$ ls site
about  fonts  index.html  license  search.html
css    img    js          mkdocs   sitemap.xml

sitemap.xml filemkdocs/search_index.jsonといったファイルも作られる。
gitでファイルを管理している場合、siteファイルはgitの管理下に置きたくないので、以下のコマンドで.gitignore file"site/"を追加する。

echo "site/" >> .gitignore

感想

絵文字が使えなかったのがとても残念だけどかなり便利。というかMarkdownが便利。

参考

www.mkdocs.org

Webスクレイピングで、、

インターンの方でWebスクレイピングが必要になったので、お勉強。

shop.oreilly.com

f:id:kimoppy126:20170702162842p:plain

 

このHTML中の

<tr class="gift" id="gift1"><td>
<tr class="gift" id="gift2"><td>
<tr class="gift" id="gift3"><td>
<tr class="gift" id="gift4"><td>
<tr class="gift" id="gift5"><td>
をとってきたいんだけど、

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html, "html.parser")
for sibling in bsObj.find("table").tr.next_sibilings:
print(sibling)
でとってこれて、

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html, "html.parser")
for sibling in bsObj.find("tbody").tr.next_sibilings:
print(sibling)

でとってこれないのがなんでかわからない。

AttributeError: 'NoneType' object has no attribute 'tr'
エラーから考えるとtbodyはタグとして認識されてない(?)ぽい

へるぷみー

O/Nの罠

4℃ O/N

お久しぶりである。

O/Nという表現、なんだかわかるだろうか?
OverNightの略である。
有機化学の実験プロトコルだとよくあるそうだが、自分の場合、一次抗体を抗原に反応させる際に登場した。

というか、今、登場してて、あれ、OverNightって、夜が明ければいいもんだと思ってたけど、実際どうなんだろ。。23:45だけど、明日の5時半には実験を始めたい。つまり6時間弱しか反応時間ないわけだけど、これってOverNightと言っていいんだろうか。。

少し調べてたら、基本的にOverNightは8時間以上を表すらしい。平均睡眠時間が8時間とかなのかな?

まぁでも、おそらくメーカー保証として、OverNightで反応しない抗体は商品として売れない。程度のものだと思う。つまり、品質保証の尺度として、使われているんじゃなかろうか。
賞味期限の原理と同じで、おそらく少しくらい短くても反応はすると考えられる。
ほとんどの食料を賞味期限が切れてから食っている自分からしたら、こんなあいまいな表現はギリギリを攻めてしまう。

抗体の質が良ければ室温10分でも検出されるらしいし、今回モノクロナール抗体を使ってるし。
たぶん大丈夫だろ。。

Grinnを使った統計解析

GrinnというRのパッケージを使って統合解析を行ったのでまとめておく。あくまでもメモスタイル。

Grinnとは

バイオインフォマティクスのプラットフォーム。Neo4jというアプリケーションで使える内部グラフデータベース、オミクス研究向けのRパッケージを含む。 グラフデータベースには、KEGGや SMPDB、ENSEMBLといったいくつかのデータベースを含んでいる。異なるネットワークの再構築が可能。例えば、

  • metabolite-protein-gene
  • metabolite-protein, metabolite-pathway
  • protein-gene
  • protein-pathway
  • gene-pathway

インストー

必要ソフト
  • R
  • shiny
  • 以下のコマンドを用いたRパッケージのインストー

      #Install devtools R package, 
      if not exist
      install.packages("devtools")
    
      #Install grinn package
      library(devtools)
      devtools::install_github("kwanjeeraw/grinn")
      library(grinn)
    

内部データベース

Human, Arabidopsis, Mouse, Rat, Saccharomyces cerevisiae and Escherichia coli k-12に対するデータベースが利用可能。Humanデータベースはデフォルトで利用可能。

Grinnのデータベースは以下から入手可能。 https://sourceforge.net/projects/grinn/

データベースの切り替え

  • Neo4jが必要

    • 起動

      $ bin/neo4j start
      Active database: graph.db
      Directories in use:
      ・
      ・
      ・
      Neo4j is already running (pid 20733)
      
    • 確認

      $ curl -H Accept:application/json 
      http://localhost:7474/db/data/
      {
      "extensions" : { },
      "node" : "http://localhost:7474/db/data/node",
      "relationship" : 
      "http://localhost:7474/db/data/relationship",
      "node_index" : "http://localhost:7474/db/data/index/node",
      "relationship_index" :"http://localhost:7474/db/data/index/relationship",
      "extensions_info" : "http://localhost:7474/db/data/ext",
      "relationship_types" : "http://localhost:7474/db/data/relationship/types",
      "batch" : "http://localhost:7474/db/data/batch",
      "cypher" : "http://localhost:7474/db/data/cypher",
      "indexes" : "http://localhost:7474/db/data/schema/index",
      "constraints" : "http://localhost:7474/db/data/schema/constraint",
      "transaction" : "http://localhost:7474/db/data/transaction",
      "node_labels" : "http://localhost:7474/db/data/labels",
      "neo4j_version" : "3.2.1"
      

      }

    • 停止

       $ bin/neo4j stop
      
  • データベースの確認、切り替え

      #Change the internal database by providing the database url, e.g. "http://database.location:7474/db/data/"
      setGrinnDb("http://localhost:7474/db/data/")
    
      #Check current internal database location
      getGrinnDb()
    

解析

  • fetchGrinnNetwork 生物学的ネットワークの再構築。Grinnの内部データベースを用いる
  • fetchCorrGrinnNetwork 加重相関ネットワークの算出とGrinnの内部ネットワークを用いたネットワークの拡張
  • fetchDiffCorrGrinnNetwork 差動相関ネットワークの算出とGrinnの内部ネットワークを用いたネットワークの拡張
  • fetchModuGrinnNetwork 表現型相関ネットワークの算出とGrinnの内部ネットワークを用いたネットワークの拡張
  • fetchGrinnCorrNetwork Grinn内部データベースを用いた生物学的ネットワークの再構築
  • input formats Grinnで使用できるインプットのフォーマット

fetchModuGrinnNetworkを用いた40サンプルでの解析

f:id:kimoppy126:20170612200928p:plain
こんな感じ。