PhytoMine-Pythonで植物の遺伝子情報を取得してみた

[Phytozome](https://phytozome.jgi.doe.gov/pz/portal.html)のデータをPythonから呼び出せる、PhytoMineというものの存在を知ったので試してみました。Phytozomeは植物の研究者には馴染み深いサイトで、様々な植物種のゲノム・遺伝子情報を調べるのに便利なサイトです。

PhytoMineは[InterMine](http://intermine.org/)というデータウェアハウスシステムのレジストリの一つです。

>InterMineは、LGPL2.1の下でライセンス供与されているオープンソースのデータウェアハウスシステムです。 InterMineは、高度なWebクエリツールによってアクセスされる生物学的データのデータベースを作成するために使用されます。 InterMineを使用して、単一のデータセットからデータベースを作成したり、複数のデータソースを統合したりできます。 いくつかの一般的な生物学的フォーマットのサポートが提供され、他のデータを追加するためのフレームワークがあります。 InterMineには、「箱から出してすぐに」機能し、簡単にカスタマイズできるユーザーフレンドリーなWebインターフェイスが含まれています。
>Wikipedia "[InterMine](https://en.wikipedia.org/wiki/InterMine)"より

InterMineはPythonを含む様々なプログラミング言語で利用することができます。詳しい情報は[API and Client Libraries](https://intermine.readthedocs.io/en/latest/web-services/#api-and-client-libraries)を参考に。

PythonでのPhytoMineの使い方について、[InterMine-Pythonのチュートリアル](https://github.com/intermine/intermine-ws-python-docs)を参考に試してみました。インストールはpipでやりました。

```
$ pip install intermine
```

クエリとして遺伝子機能と植物種を指定して、Pythonで遺伝子のリストを取得してみました。リストの作成はPandasで行いました。ソースコードは以下の通り。

```python
size = 20 #取得するデータ数を指定

import pandas as pd
from intermine.webservice import Service

service = Service("https://phytozome.jgi.doe.gov/phytomine/service") #PhytoMineのURLを指定してインスタンスを作成
query = service.new_query("Gene") #遺伝子情報を取得する
query.add_constraint("briefDescription","CONTAINS","transcription factor") #遺伝子機能を指定(条件A)
query.add_constraint("name","CONTAINS","Eucgr") #ユーカリ・グランディスの遺伝子名の頭につく"Eucgr"を利用してユーカリ・グランディスを植物種として指定(条件B)
query.add_constraint("name","CONTAINS","Potri") #ポプラの遺伝子名の頭につく"Potri"を利用してポプラを植物種として指定(条件C)
query.set_logic("A & (B | C)") #ユーカリ・グランディスとポプラ、両方の遺伝子を調べるための設定(条件A かつ 条件Bまたは条件C)

dfs = [] #出力を保存するための空リストを作成
for row in query.rows(size=size):
    dfs.append(pd.DataFrame(row.values(),index=row.keys()).T) #データの取得とリストへの保存

dfs = pd.concat(dfs) #リストをデータフレームに変換
dfs.to_csv("Tree_TFs_Top20.csv")  #データフレームをcsv形式で保存
```

<div class="output_html rendered_html output_subarea output_execute_result">
<div>
<style scoped="">
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>Gene.briefDescription</th>
      <th>Gene.cytoLocation</th>
      <th>Gene.description</th>
      <th>Gene.genomicOrder</th>
      <th>Gene.id</th>
      <th>Gene.length</th>
      <th>Gene.name</th>
      <th>Gene.primaryIdentifier</th>
      <th>Gene.score</th>
      <th>Gene.scoreType</th>
      <th>Gene.secondaryIdentifier</th>
      <th>Gene.symbol</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>0</td>
      <td>(1 of 102) PF00319 - SRF-type transcription fa...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>49560540</td>
      <td>186</td>
      <td>Potri.010G098100</td>
      <td>Potri.010G098100</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:26981244</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 102) PF00319 - SRF-type transcription fa...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303626540</td>
      <td>186</td>
      <td>Potri.010G098100</td>
      <td>Potri.010G098100</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37221527</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>48348276</td>
      <td>2263</td>
      <td>Potri.007G090600</td>
      <td>Potri.007G090600</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:27016559</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>48359640</td>
      <td>1853</td>
      <td>Potri.003G139300</td>
      <td>Potri.003G139300</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:26998891</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>48837989</td>
      <td>1051</td>
      <td>Potri.005G168700</td>
      <td>Potri.005G168700</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:27030760</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>49691741</td>
      <td>1649</td>
      <td>Potri.017G055400</td>
      <td>Potri.017G055400</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:26983926</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>50099858</td>
      <td>2177</td>
      <td>Potri.005G077300</td>
      <td>Potri.005G077300</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:27029242</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>50216626</td>
      <td>2401</td>
      <td>Potri.013G135600</td>
      <td>Potri.013G135600</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:26993814</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>50231866</td>
      <td>2179</td>
      <td>Potri.019G102200</td>
      <td>Potri.019G102200</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:27025339</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303511172</td>
      <td>2177</td>
      <td>Potri.005G077300</td>
      <td>Potri.005G077300</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37265642</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303527050</td>
      <td>1051</td>
      <td>Potri.005G168700</td>
      <td>Potri.005G168700</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37263387</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303695561</td>
      <td>2263</td>
      <td>Potri.007G090600</td>
      <td>Potri.007G090600</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37252859</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303799992</td>
      <td>2401</td>
      <td>Potri.013G135600</td>
      <td>Potri.013G135600</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37233326</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>303940612</td>
      <td>2179</td>
      <td>Potri.019G102200</td>
      <td>Potri.019G102200</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37260937</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>304098097</td>
      <td>1649</td>
      <td>Potri.017G055400</td>
      <td>Potri.017G055400</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37223899</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 10) PTHR31657:SF9 - ETHYLENE-RESPONSIVE ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>304255554</td>
      <td>1853</td>
      <td>Potri.003G139300</td>
      <td>Potri.003G139300</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:37236557</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 11) K08064 - nuclear transcription facto...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>49458724</td>
      <td>4801</td>
      <td>Potri.011G098400</td>
      <td>Potri.011G098400</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:27000615</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 11) KOG4282 - Transcription factor GT-2 ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>174786351</td>
      <td>2903</td>
      <td>Eucgr.J01012</td>
      <td>Eucgr.J01012</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:32033046</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 11) KOG4282 - Transcription factor GT-2 ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>174819386</td>
      <td>2316</td>
      <td>Eucgr.J02994</td>
      <td>Eucgr.J02994</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:32035652</td>
      <td>None</td>
    </tr>
    <tr>
      <td>0</td>
      <td>(1 of 11) KOG4282 - Transcription factor GT-2 ...</td>
      <td>None</td>
      <td>None</td>
      <td>None</td>
      <td>175094637</td>
      <td>2197</td>
      <td>Eucgr.G03225</td>
      <td>Eucgr.G03225</td>
      <td>None</td>
      <td>None</td>
      <td>PAC:32071912</td>
      <td>None</td>
    </tr>
  </tbody>
</table>
</div>
</div>

PhytoMineの[QueryBuilderのページ](https://phytozome.jgi.doe.gov/phytomine/customQuery.do)をみる限り、クエリに使えるデータタイプは遺伝子以外にも色々とあるようなので、ぼちぼち試していきたいです。