Python_(6/4)T6600の生データを解析してPTM結果をレポート | バイオとDX

バイオとDX

バイオ医薬品とDX、データサイエンス

# =============================================================================
# Modificationのフィルタリングしてペプチドごとにタブ化する
# =============================================================================

# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
# 残っている作業
# 1)読みに行く配列をLCとHCで切り替える
# 2)アミノ酸リストを作成
# 3)に沿って、すべてのアミノ酸のエクセル作成を繰り返す
# 4)HCとLCのもの_4ファイルを、アミノ酸ごとに2つを作る
# ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■


import os
import datetime
import pandas as pd
import re

from openpyxl import load_workbook
from openpyxl.styles import Font
from openpyxl.styles.alignment import Alignment
from openpyxl.utils.dataframe import dataframe_to_rows

# 元になるエクセルファイルを読み込み
xls0 = 'bpv'
xls = str(xls0) +'.xlsx'

# 配列入力
seq_hc = 'ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0'

seq_lc = 'ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0'


Modific = input('どのPTMを抽出する? 1: Deamidated, 2: Oxidation, 3: Hex ?')

if Modific == '1':
    ModificD = 'Deamidated'
elif Modific == '2':
    ModificD = 'Oxidation'
elif Modific == '3':
    ModificD = 'HEX'
else:
    ModificD = 'Others'
    
# エクセルの所定のシートを指定して、データフレームに読み込む
df11 = pd.read_excel(xls, sheet_name='Matched')

# =============================================================================
# 条件に合致するものだけを選び出す
# =============================================================================

# ■ 基準1/9 ■ Auto-Validatedが、「TRUE」のもの
#df = df[df['Auto-Validated'] == True]

# ■ 基準2/9 ■ Useが、「Certain」のもの
#df = df[df['Use'] == 'Use']

# ■ 基準3/9 ■ Errorが、10ppm以下のもの
#df = df[df['Error (ppm)'] < 10]

# ■ 基準4/9 ■ Modificationsが空欄のものは除外
#df = df[pd.notnull(df3['Modifications']) == True]
 
# ■ 基準5/9 ■ DeとOxとHxの合計が一つ/Modificationsで、表記が1つだけのものを抽出

# Modification の ModificDを規定
De = 'Deamidated'
Ox = 'Oxidation'
Hx = 'HEX'

Ca = 'Carboxymethyl'
a2 = 'A2G1'
m5 = 'M5'
g0 = 'G0'
g1 = 'G1'
g2 = 'G2'

df12  = df11[df11['Modifications'].str.count(De) +df11['Modifications'].str.count(Ox) +df11['Modifications'].str.count(Hx) == 1]

# ■ 基準6/9 ■  どのPTMかで抽出する
df13 = df12[df12['Modifications'].str.count(ModificD) == 1]
    
# =============================================================================
# Deamiか、Oxidation、あるいはHEX を含むものだけにして、あとはすべて除去する
# =============================================================================

df14 = df13['Modifications']

li_modi1 = []
li_deam = []

for i, deam in enumerate(df14):
    li_deam1 = re.split(',', deam)
    for j, modi3 in enumerate(li_deam1):
        print('modi3: ' + modi3)
        if (De in modi3):  
            modi3 = modi3.strip()  #空白文字を除く            
            li_deam.append(modi3)  #合致したものをリストに追加                 
        else:
            None

df13['Modifications1'] = li_deam

# =============================================================================
# 日付を得て、ディレクトリにフォルダを作成して、結果を保存
# =============================================================================

# 日付取得/ファイル名のため
d_today = str(datetime.date.today())

# ディレクトリにフォルダ作成
dirname = d_today +'/'
if not os.path.exists(dirname):
    os.mkdir(dirname)   
    
# エクセルとして保存
filename11 = dirname + ModificD +'_' +xls
df13.to_excel(filename11)

# =============================================================================
# エクセルの書式設定
# =============================================================================
wb = load_workbook(filename11)
ws = wb.active

# set font  #【エクセル】フォント設定
font = Font(name='Calibri', size=9)
for row in ws:
    for cell in row:
        ws[cell.coordinate].font = font

# alignment  #【エクセル】タイトル行だけ左寄せ
for row in ws['A1:AZ1']:
    for cell in row:
        cell.alignment = Alignment(horizontal='left')

wb.save(filename11)    #【エクセル】書式整えたものを保存

# =============================================================================
# Modifictionsにある、(1)記述、(2)ぺプチド番号、(3)アミノ酸番号を分解して、エクセルにこれらの列を追加する。
# =============================================================================

# sheet1を指定して、データフレームに読み込む
df20 = pd.read_excel(filename11, sheet_name='Sheet1')

# Modificationに記された、(1)記述, (2)ペプチド番号、(3)アミノ酸番号に分解する。
df21 = df20['Modifications1']
print(df21)

Aaa = []  #Deamidated / Oxidation / ...
PPn = []  #ペプチド番号
An = []  #アミノ酸番号
AAn = []  #アミノ酸表記
AnAAn = []  #アミノ酸表記
BBB1 = []  #Modificationを分解したリスト

for i, AAA in enumerate(df21):
    BBB1 = re.split('[\xa0@()]',AAA)
#----------
    if len(BBB1) >=1:
        Aaa1 = BBB1[0]
    else:
        Aaa1 = '9999'  #空欄のときは、9999 を割り当てる
    Aaa.append(Aaa1)  
#----------    
    if len(BBB1) >=2:
       PPn1 = BBB1[1]
    else:
        PPn1 = '9999'  #空欄のときは、9999 を割り当てる
    PPn.append(PPn1)  
#----------        
    if len(BBB1) >=3:
        AAn1 = BBB1[2]
    else:
        AAn1 = '9999'  #空欄のときは、9999 を割り当てる
    AAn.append(AAn1)
#----------                        
    if len(BBB1) >=3:
        if (BBB1[2] == '') or (BBB1[2] == '*'):
            An1 = 'X'   #空欄のときは、X を割り当てる
        else:
            print(BBB1[2])
            An1 = seq_hc[int(BBB1[2])] #文字列の要素にアクセスしようとした際に、その要素が存在しない場合に発生するエラーです。
        An.append(An1) 

    else:
        An1 = 'X'  #BBB1の表記が足らないで、割り当てられていないときは、アミノ酸 X を割り当てる
        An.append(An1)
        
    AnAAn.append(str(An1)+str(AAn1))
               
df20['Modifications_Aaa'] = Aaa
df20['Modifications_PPn'] = PPn
df20['Modifications_AAn'] = AAn
df20['Modifications_An'] = An
df20['Modifications_AnAAn'] = AnAAn
    
# エクセルとして保存
filename21 = dirname + ModificD +'_' +xls0 +'2.xlsx'
df20.to_excel(filename21)

# =============================================================================
# エクセルの書式設定
# =============================================================================
wb = load_workbook(filename21)
ws = wb.active

# set font
font = Font(name='Calibri', size=9)

# write in sheet
for row in ws:
    for cell in row:
        ws[cell.coordinate].font = font

# alignment  #【エクセル】タイトル行だけ左寄せ
for row in ws['A1:AZ1']:
    for cell in row:
        cell.alignment = Alignment(horizontal='left')

wb.save(filename21)

# =============================================================================
# あらかじめX999が記述されたExcelを元に、アミノ酸ごとにwbを作成、Peptideごとにwsにして分類する
# =============================================================================
  
df40 = pd.read_excel(filename21, sheet_name='Sheet1')
AAnAn = 'E84'

# =============================================================================
# アミノ酸をリスト化。重複をさけてSeries作る
Ser3 = df40['Modifications_AnAAn'] #X100のリスト化
ser_AnAAn = set(Ser3) #X100のリスト化/重複回避
print(ser_AnAAn)

# =============================================================================
# (アミノ酸で制限をかけて) ペプチドをリスト化。重複をさけてSeries作る
df41 = df40[df40['Modifications_AnAAn'] == AAnAn] #B61のアミノ酸のwb作成
Ser5 = df41['Peptide']
ser_Pep = set(Ser5) #ペプチドのリスト化/重複回避
print(ser_Pep) #ワークシートタイトルのser_Pep作成

# エクセルとして保存
filename41 = dirname +'hc_'+ModificD +'_' +AAnAn + '_4.xlsx'
df41.to_excel(filename41)

# ペプチドリストをもとにシートを作成
wb = load_workbook(filename41)
ws = wb.active
ws.title = 'total'
for i, page in enumerate(ser_Pep):
    ws = wb.create_sheet()
    df6 = df41[df41['Peptide'] == page]
    for row in dataframe_to_rows(df6,index=None, header=True):
        ws.append(row)   
        ws.title = str(page)
    
wb.save(filename41) #workbook保存

# コードの終わり