LifeScience Hack

生物系創薬研究者がAI(誇大表示)を手に入れるまでの過程(Python、Deep Learning、ライフサイエンス)

Pythonで論文情報をまとめてゲットする⑤ ~ Openpyxlを使ってExcelファイルとして保存する ~ 

今回はこれまでにゲットした情報をExcelに保存したいと思います。

これまでの記事はこちら
● Pythonで論文情報をまとめてゲットする①~ PubMed APIについて~
● Pythonで論文情報をまとめてゲットする②~ 下準備 ~
● Pythonで論文情報をまとめてゲットする③~ ESearchを使ってPMIDを取得 ~
● Pythonで論文情報をまとめてゲットする④~ ESummaryを使って論文タイトルを取得 ~

前回の記事Summariesというオブジェクトを作成し、
そこに論文情報(PMID, Title, Author, Journal, Pubdate)を格納しました。

Summariesにはリストの中にそれぞれの論文の情報を辞書形式で入れてます。
扱いやすくかつ見やすくする目的でExcelの表形式の様な見た目のデータフレームを扱えるライブラリPandasに入れていきます。

PandasPythonでのデータ分析には必須のライブラリです。

また、実際に書き出して保存する時にはExcelが便利かと思いますので、
PandasでのデータフレームをExcelファイルとして保存する為に必須のライブラリであるOpenpyxlも使っていきます。

ライブラリのimport

まずは必要なライブラリをimportします。

import pandas as pd
import openpyxl

エラーなくインポートされたらOKです。

Pandas データフレームの作成

ここからエクセルの表のようにデータを格納します。
最終的にはこうなるイメージです。
f:id:tottoham:20190107000116p:plain

空のデータフレームを作成

data  = pd.DataFrame(columns = ['PMID','Title', 'Author', 'Journal', 'Pubdate'])
# カラム名を指定してデータフレームを作成

カラム名を指定した空のデータフレームを作成しました。下画像参照 f:id:tottoham:20190106230928p:plain
カラム名のみ入った空のデータフレームが作成されましたね。

データフレームへの格納

まず、Summariesよりカラム毎(PMIDやTitleなど)のリストを作成します。

PMIDs = [ i['pmid'] for i in Summaries ]
Titles = [ i['title'] for i in Summaries ]
Authors = [ i['Author'] for i in Summaries ]
Journals = [ i['Journal'] for i in  Summaries ]
Pubdates = [ i['Pubdate'] for i in Summaries ]

作成したリストそれぞれをデータフレームに格納します。

data['PMID'] = PMIDs
data['Title'] = Titles
data['Author'] = Authors
data['Journal'] = Journals
data['Pubdate'] = Pubdates

Outputが以下のようになります。 f:id:tottoham:20190106233018p:plain

OpenpyxlでExcel fileとして書き出す

必要なライブラリのインポート

import openpyxl
from openpyxl.styles import Border, Font, Side, PatternFill, Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

1行目は重複となりますがopenpyxlのインポートをしています。
2行目はExcel上のスタイル(フォント、太字、塗り)などを設定するため。
3行目はPandasデータフレームをそのままopenpyxlに持っていくために使用します。

Bookの作成とシートの設定

wb = openpyxl.Workbook() #ワークブックの作成
ws = wb.active #ワークブックのアクティブになってるシートを選択
ws.title='論文' #シートの名前を変更

スタイルの設定値を決める

Excelとして書き出す際のフォントを設定していきます。 これは私個人の好みの設定ですので、各自いろいろ変えてみてください。

#フォントの設定
normal_font = Font(name = "Century Gothic",sz = 9,b = False)
header_font = Font(name = "Century Gothic", sz = 9, b = True, color = 'FFFFFFFF')
#ヘッダーの塗りの設定
header_fill = PatternFill(patternType = "solid", fgColor = "FF808080")
#ヘッダーを中央揃えにする設定
header_center = Alignment(horizontal='center',vertical = 'center')    
#ヘッダーを太字にする設定
header_border = Border(
        outline=True,
        left=Side(style='thin', color='FF000000'),
        right=Side(style='thin', color='FF000000'),
        top=Side(style='thin', color='FF000000'),
        bottom=Side(style='thin', color='FF000000')
        )

pandasデータフレームをopenpyxlのシートへ書き込む

for r in dataframe_to_rows(data, index=False, header=True):
    ws.append(r)

これでpandasデータフレームがエクセルのシートに書き込まれました。

設定したスタイルを適用する

まずは、エクセルシートの全体のスタイルを設定します。 上で設定したnormal_fontを適応します。
フォントがCentury Gothicのサイズが9になるはずです。

for row in ws:
    for cell in row:
        cell.font = normal_font

次はheaderのスタイルを指定します。
headerはPMID、Title、Author、Journal、Pubmedの5つですので、 Cellは1行目の1列目から5列目がheaderとなります。

header_cell = ['A1', 'B1', 'C1', 'D1', 'E1']
for cell in header_cell:
    ws[cell].font = header_font
    ws[cell].fill = header_fill
    ws[cell].alignment = header_center
    ws[cell].border = header_border

エクセルファイルの保存

wb.save("test.xlsx")

エクセルを開くと以下のようになります。
セル幅は開いたあとに調整してます。
f:id:tottoham:20190223221509p:plain

以上でpythonを使ってPubmedから論文情報を取得するシリーズの大きな部分は終了です。 これから更に発展して、abstractを引き抜いたりできますが、要望が多ければブログにしたいと思いますので、
コメントにお願いいたします。 また、tips等あったら記事にしたいと思います。 お疲れ様でした。