自由研究2(厚労省のワクチンの成分がどこに行くのかを調べたPDF資料からの取り込みと、ソート)
1 概要
- ファイザーワクチンの動物実験のデータがあり、どの臓器にどのくらい行くのかがわかる表がある。
- PDFファイルで、処理しにくいのだが、多く行く臓器と、行く量がピークとなる時間の表を作成されている方がいたので、それをプログラムでやってみることにしました。
2 関連文書
2.1 厚労省の資料
- 2.6.4 薬物動態試験の概要文 https://www.pmda.go.jp/drugs/2021/P20210212001/672212000_30300AMX00231_I100_1.pdf
- P.16, P.17
- 審議結果報告書 https://www.mhlw.go.jp/content/10601000/000739089.pdf
2.2 使ったPythonパッケージ
- tabula-py https://github.com/chezou/tabula-py
- pandas https://pandas.pydata.org/
- googletrans https://github.com/ssut/py-googletrans (これもしかしたらGoogleの規約違反かもしれないので、使うのやめました)
- その他必要なものがあれば、それもインストールしてください。
3 厚労省のPDFファイルから2つの表を抜き出し、外部ファイルに保存
3.1 説明動画
3.2 厚労省のPDFファイルから2つの表を抜き出し、外部ファイルに保存する手順
3.2.1 仮想環境を用意し作業ディレクトリに入る
virtualenv covid-19 cd covid-19 source bin/activate
3.2.2 必要なパッケージインストール
pip install tabula-py pip install ipython
3.2.3 元のPDFファイルをダウンロードして作業ディレクトリに保存
- 2.6.4 薬物動態試験の概要文 https://www.pmda.go.jp/drugs/2021/P20210212001/672212000_30300AMX00231_I100_1.pdf
- ここではwgetでやってますが、他のツールでOK、ブラウザとか
wget https://www.pmda.go.jp/drugs/2021/P20210212001/672212000_30300AMX00231_I100_1.pdf
3.2.4 PDFファイルのP.16,17から目的の表の一部を取り出して、ファイルに保存
- Pythonの対話環境起動
ipython
- プログラムを動かして、表を作成して外部ファイルに保存
import pandas as pd import tabula # pdfからデータ読み込み d0 = tabula.read_pdf("672212000_30300AMX00231_I100_1.pdf",pages="16,17") #d0 = tabula.read_pdf("672212000_30300AMX00231_I100_1.pdf",pages="16,17",stream=True) #d0 = tabula.read_pdf("672212000_30300AMX00231_I100_1.pdf",pages="16,17",lattice=True) # カラム名の変更 d0[0].columns=['Sample','v1','v20','v21'] d0[1].columns=['Sample','v1','v20','v21'] for i,j in enumerate(d0[0]["v1"].isnull()): if j: d0[0]["Sample"][i-1]=d0[0]["Sample"][i-1]+" "+d0[0]["Sample"][i] for i,j in enumerate(d0[1]["v1"].isnull()): if j: d0[1]["Sample"][i-1]=d0[1]["Sample"][i-1]+" "+d0[1]["Sample"][i] # NaNのデータ削除 d1=d0[0][d0[0]["v1"].notnull()] d2=d0[1][d0[1]["v1"].notnull()] # 経過時間名の配列作成 idx=d2["v1"][1].replace(" h","h").split(" ") # 表の左側のみ残す d11=d1.drop([0,1]).drop(["v20","v21"],axis=1) d22=d2.drop([0,1]).drop(["v20","v21"],axis=1) # 列番号のふりなおし d111=d11.reset_index(drop=True) d222=d22.reset_index(drop=True) # データを配列に d1111=d111["v1"].str.rsplit(" ",expand=True) d2222=d222["v1"].str.rsplit(" ",expand=True) # 配列データが文字列なので、数値に変換 for i in range(7): d1111[i] = pd.to_numeric(d1111[i]) d2222[i] = pd.to_numeric(d2222[i]) # 列の名前を経過時間に変更 d1111.columns=idx d2222.columns=idx # 行毎の最高値と、そのインデックスを調べ、maxとtmaxという列を追加して格納 tmpmax=d1111.max(axis=1) tmptmax=d1111.idxmax(axis=1) d1111["max"]=tmpmax d1111["tmax"]=tmptmax # 行毎の最高値と、そのインデックスを調べ、maxとtmaxという列を追加して格納2 tmpmax=d2222.max(axis=1) tmptmax=d2222.idxmax(axis=1) d2222["max"]=tmpmax d2222["tmax"]=tmptmax # 一番左にenという列を追加して、英語名を入れる d1111.insert(0,"en",d111["Sample"]) d2222.insert(0,"en",d222["Sample"]) # P.16の表とp.17の表を結合してddという表にまとめる dd=pd.merge(d1111,d2222,how="outer") # 英語名を日本語に翻訳したk、jaという配列作成 ja = ['脂肪組織', '副腎', '膀胱', '骨(大腿骨)', '骨髄(大腿骨)', '脳', '目', '心臓', '注射部位', '腎臓', '大腸', '肝臓', '肺', 'リンパ節(下顎)', 'リンパ節(腸間膜)', '筋', '卵巣(雌)', '膵臓', '脳下垂体', '前立腺(男性)', '唾液腺', '肌', '小腸', '脊髄', '脾臓', 'お腹', 'テスト(悪)', '胸腺', '甲状腺', '子宮(女性)', '全血', '血漿', '血液:血漿比'] # ddの一番右に日本語名を"ja"という列名で追加 dd.insert(len(dd.columns),"ja",ja) # pickleパッケージで、作成した表を外部ファイル seibun_data2.pickle に保存 import pickle with open('seibun_data2.pickle', 'wb') as f: pickle.dump(dd,f)
3.2.5 作成した表データを表示してみる
en 0.25h 1h 2h 4h 8h 24h 48h max tmax ja 0 Adipose tissue 0.057 0.100 0.126 0.128 0.093 0.084 0.181 0.181 48h 脂肪組織 1 Adrenal glands 0.271 1.480 2.720 2.890 6.800 13.800 18.200 18.200 48h 副腎 2 Bladder 0.041 0.130 0.146 0.167 0.148 0.247 0.365 0.365 48h 膀胱 3 Bone (femur) 0.091 0.195 0.266 0.276 0.340 0.342 0.687 0.687 48h 骨(大腿骨) 4 Bone marrow (femur) 0.479 0.960 1.240 1.240 1.840 2.490 3.770 3.770 48h 骨髄(大腿骨) 5 Brain 0.045 0.100 0.138 0.115 0.073 0.069 0.068 0.138 2h 脳 6 Eyes 0.010 0.035 0.052 0.067 0.059 0.091 0.112 0.112 48h 目 7 Heart 0.282 1.030 1.400 0.987 0.790 0.451 0.546 1.400 2h 心臓 8 Injection site 128.000 394.000 311.000 338.000 213.000 195.000 165.000 394.000 1h 注射部位 9 Kidneys 0.391 1.160 2.050 0.924 0.590 0.426 0.425 2.050 2h 腎臓 10 Large intestine 0.013 0.048 0.093 0.287 0.649 1.100 1.340 1.340 48h 大腸 11 Liver 0.737 4.630 11.000 16.500 26.500 19.200 24.300 26.500 8h 肝臓 12 Lung 0.492 1.210 1.830 1.500 1.150 1.040 1.090 1.830 2h 肺 13 Lymph node (mandibular) 0.064 0.189 0.290 0.408 0.534 0.554 0.727 0.727 48h リンパ節(下顎) 14 Lymph node (mesenteric) 0.050 0.146 0.530 0.489 0.689 0.985 1.370 1.370 48h リンパ節(腸間膜) 15 Muscle 0.021 0.061 0.084 0.103 0.096 0.095 0.192 0.192 48h 筋 16 Ovaries (females) 0.104 1.340 1.640 2.340 3.090 5.240 12.300 12.300 48h 卵巣(雌) 17 Pancreas 0.081 0.207 0.414 0.380 0.294 0.358 0.599 0.599 48h 膵臓 18 Pituitary gland 0.339 0.645 0.868 0.854 0.405 0.478 0.694 0.868 2h 脳下垂体 19 Prostate (males) 0.061 0.091 0.128 0.157 0.150 0.183 0.170 0.183 24h 前立腺(男性) 20 Salivary glands 0.084 0.193 0.255 0.220 0.135 0.170 0.264 0.264 48h 唾液腺 21 Skin 0.013 0.208 0.159 0.145 0.119 0.157 0.253 0.253 48h 肌 22 Small intestine 0.030 0.221 0.476 0.879 1.280 1.300 1.470 1.470 48h 小腸 23 Spinal cord 0.043 0.097 0.169 0.250 0.106 0.085 0.112 0.250 4h 脊髄 24 Spleen 0.334 2.470 7.730 10.300 22.100 20.100 23.400 23.400 48h 脾臓 25 Stomach 0.017 0.065 0.115 0.144 0.268 0.152 0.215 0.268 8h お腹 26 Testes (males) 0.031 0.042 0.079 0.129 0.146 0.304 0.320 0.320 48h テスト(悪) 27 Thymus 0.088 0.243 0.340 0.335 0.196 0.207 0.331 0.340 2h 胸腺 28 Thyroid 0.155 0.536 0.842 0.851 0.544 0.578 1.000 1.000 48h 甲状腺 29 Uterus (females) 0.043 0.203 0.305 0.140 0.287 0.289 0.456 0.456 48h 子宮(女性) 30 Whole blood 1.970 4.370 5.400 3.050 1.310 0.909 0.420 5.400 2h 全血 31 Plasma 3.970 8.130 8.900 6.500 2.360 1.780 0.805 8.900 2h 血漿 32 Blood:Plasma ratioa 0.815 0.515 0.550 0.510 0.555 0.530 0.540 0.815 0.25h 血液:血漿比
3.2.6 表を読み込み、その臓器に行った量の多い順にソート、そして、結果をCSVで出力
import pickle import pandas as pd import tabula # データ読み込み with open('seibun_data2.pickle', 'rb') as f: dd=pickle.load(f) print(dd.sort_values(["max","tmax"], ascending=False).reset_index(drop=True)) print() print(dd.sort_values(["max","tmax"], ascending=False).reset_index(drop=True)[["en","max","tmax","ja"]]) print() print(dd.sort_values(["max","tmax"], ascending=False).reset_index(drop=True)[["max","tmax","ja"]]) # csvファイルとして外部出力 dd.to_csv("seibun_out01.csv") dd.to_csv("seibun_out02.csv", index=None)
- 最後に出力した表
max tmax ja 0 394.000 1h 注射部位 1 26.500 8h 肝臓 2 23.400 48h 脾臓 3 18.200 48h 副腎 4 12.300 48h 卵巣(雌) 5 8.900 2h 血漿 6 5.400 2h 全血 7 3.770 48h 骨髄(大腿骨) 8 2.050 2h 腎臓 9 1.830 2h 肺 10 1.470 48h 小腸 11 1.400 2h 心臓 12 1.370 48h リンパ節(腸間膜) 13 1.340 48h 大腸 14 1.000 48h 甲状腺 15 0.868 2h 脳下垂体 16 0.815 0.25h 血液:血漿比 17 0.727 48h リンパ節(下顎) 18 0.687 48h 骨(大腿骨) 19 0.599 48h 膵臓 20 0.456 48h 子宮(女性) 21 0.365 48h 膀胱 22 0.340 2h 胸腺 23 0.320 48h テスト(悪) 24 0.268 8h お腹 25 0.264 48h 唾液腺 26 0.253 48h 肌 27 0.250 4h 脊髄 28 0.192 48h 筋 29 0.183 24h 前立腺(男性) 30 0.181 48h 脂肪組織 31 0.138 2h 脳 32 0.112 48h 目
3.3 この章のまとめ
- 厚労省の資料 2.6.4 薬物動態試験の概要文 https://www.pmda.go.jp/drugs/2021/P20210212001/672212000_30300AMX00231_I100_1.pdf の P.16, P.17から表のデータをPythonで抜き出して、外部ファイルに保存した
- その臓器に行った量の多い順にソート、そして、結果をCSVで出力
- 最大量になった時間も表示(48時間までの実験)
4 今後
- 今後文書追加するかも、しないかも
5 この文書のチェンジログ
- 2021/09/02 初版
Created: 2021-09-07 火 12:12