Python/Deami, Oxid, Hexが1つだけ→X999、Peptideごとに分類 | バイオとDX

バイオとDX

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

# =============================================================================
# Deami, Oxid, Hexが1つだけ出てくるものをアミノ酸ごとに分類してPeptidごとにエクセルシート化 +非修飾
# =============================================================================

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-sp'
xls = str(xls0) +'.xlsx'

# 配列入力。seq_hcに重鎖、seq_lcに軽鎖を入れる
seq_hc = 'EVQL'

seq_lc = 'DIQM'


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

# =============================================================================
# タイトルに含まれる半角スペースを除く
# =============================================================================
# タイトル行をrenameする
#df11 = df110.rename(columns={'AnalysisName': 'Analysis Name','DataFile': 'Data File','TheoreticalMono.Mass': 'Theoretical Mono. Mass','TheoreticalMono.m/z': 'Theoretical Mono. m/z','ObservedMono.m/z': 'Observed Mono. m/z','Error(ppm)': 'Error (ppm)','%PeptideSequenceCoverage': '% Peptide Sequence Coverage','XIC_Area': 'XIC Area','Modification%': 'Modification %','DisulfideBonds': 'Disulfide Bonds','DisulfideBondsStatus': 'Disulfide Bonds Status','AA_Index': 'AA Index','ChainNames': 'Chain Names'})
                      
# =============================================================================
# 条件に合致するものだけを選び出す
# =============================================================================

# ■ 基準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_modificD = []

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

df13['Modifications1'] = li_modificD

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

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

# ディレクトリにフォルダ作成
dirname = d_today +'_' +xls0 +'_' +ModificD +'/'
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']
df22 = df20['ChainNames']
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)
#----------                        
    Chain = df22[i]
    if len(BBB1) >=3:
        if (BBB1[2] == '') or (BBB1[2] == '*'):
            An1 = 'X'   #空欄のときは、X を割り当てる
        else:
            if Chain == 'HC':
                An1 = seq_hc[int(BBB1[2])-1]  #HCを読みに
            elif Chain == 'LC':
                An1 = seq_lc[int(BBB1[2])-1]  #HCを読みに
    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 +'_ID.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')

# =============================================================================
# HCとLCで分けてアミノ酸をリスト化する
df401 = df40[df40['ChainNames'] == 'HC']
print(df401)

# 【HC鎖】HC鎖のアミノ酸をリスト化。重複をさけてSeries作る
Ser3HC = df401['Modifications_AnAAn'] #HC鎖のX100のリスト化
ser_AnAAn_HC = dict.fromkeys(Ser3HC) #HC鎖のX999のリスト化/重複回避

# 【HC鎖】(アミノ酸で制限をかけて) ペプチドをリスト化。重複をさけてSeries作る
for i, AAnAn1 in enumerate(ser_AnAAn_HC):    
    df411 = df401[df401['Modifications_AnAAn'] == AAnAn1] #HC,LCそれぞれでリスト化されたアミノ酸分のdf生成
    print(df411)
    Ser5HC = df411['Peptide']#Peptideのリスト
    ser_PepHC = dict.fromkeys(Ser5HC) #ペプチドのリスト化/重複回避

    # ペプチドリストをもとにシートを作成
    filename41HC = dirname +ModificD +'_HC' +'_' +AAnAn1 + '.xlsx'
    df411.to_excel(filename41HC)
    wb = load_workbook(filename41HC)
    ws = wb.active
    ws.title = 'total'+'_' +ModificD

    for i, page in enumerate(ser_PepHC):
        ws = wb.create_sheet()
        df431 = df411[df411['Peptide'] == page]
        for row in dataframe_to_rows(df431,index=None, header=True):
            ws.append(row)   
            ws.title = str(page)
    
    wb.save(filename41HC) #workbook保存


# =============================================================================
# HCとLCで分けてアミノ酸をリスト化する
df402 = df40[df40['ChainNames'] == 'LC']
print(df402)

# 【LC鎖】LC鎖のアミノ酸をリスト化。重複をさけてSeries作る
Ser3LC = df402['Modifications_AnAAn'] #LC鎖のX100のリスト化
ser_AnAAn_LC = dict.fromkeys(Ser3LC) #LC鎖のX999のリスト化/重複回避

# 【LC鎖】(アミノ酸で制限をかけて) ペプチドをリスト化。重複をさけてSeries作る
for i, AAnAn1 in enumerate(ser_AnAAn_LC):    
    df412 = df402[df402['Modifications_AnAAn'] == AAnAn1] #HC,LCそれぞれでリスト化されたアミノ酸分のdf生成
    print(df412)
    Ser5LC = df412['Peptide']#Peptideのリスト
    ser_PepLC = dict.fromkeys(Ser5LC) #ペプチドのリスト化/重複回避

    # ペプチドリストをもとにシートを作成
    filename41LC = dirname +ModificD +'_LC' +'_' +AAnAn1 + '.xlsx'
    df412.to_excel(filename41LC)
    wb = load_workbook(filename41LC)
    ws = wb.active
    ws.title = 'total'+'_' +ModificD

    for i, page in enumerate(ser_PepLC):
        ws = wb.create_sheet()
        df432 = df412[df412['Peptide'] == page]
        for row in dataframe_to_rows(df432,index=None, header=True):
            ws.append(row)   
            ws.title = str(page)
    
    wb.save(filename41LC) #workbook保存


# =============================================================================
# =============================================================================
# 非修飾のものを抽出してエクセルに書き出す
# =============================================================================
# =============================================================================

# 元のエクセルから吸いだす
df61 = pd.read_excel(xls, sheet_name='Matched')

# DeとOxとHxの合計がゼロのものを抽出
df62 = df61[df61['Modifications'].str.count(De) +df61['Modifications'].str.count(Ox) +df61['Modifications'].str.count(Hx) == 0]

# =============================================================================
# HCのものだけ抽出する
df63HC = df62[df62['ChainNames'] == 'HC']

# =============================================================================
# 日付を得て、ディレクトリにフォルダを作成して、結果を保存
# =============================================================================
# 日付取得/ファイル名のため
d_today = str(datetime.date.today())

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

# =============================================================================
# エクセルの書式設定
# =============================================================================
wb = load_workbook(filename51HC)
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')

# =============================================================================
# 【HC】HCのPeptideをリスト化(順序を優先して重複を回避)
ser_PepHC_int = df63HC['Peptide']
ser_PepHC_int2 = dict.fromkeys(ser_PepHC_int)  #HCのPeptideがリスト化できた(順番を考慮)

# ペプチドリストをもとにシートを作成
filename52HC = dirname +'HC_intact_' +xls0 + '_Pep.xlsx'
df63HC.to_excel(filename52HC)

wb = load_workbook(filename52HC)
ws = wb.active
ws.title = 'total'+'_HC_int'

for i, page in enumerate(ser_PepHC_int2):
    ws = wb.create_sheet()
    df64HC = df63HC[df63HC['Peptide'] == page]
    for row in dataframe_to_rows(df64HC,index=None, header=True):
        ws.append(row)   
        ws.title = str(page)
    
wb.save(filename52HC) #workbook保存

# =============================================================================
# LCのものだけ抽出する
df63LC = df62[df62['ChainNames'] == 'LC']

# =============================================================================
# 日付を得て、ディレクトリにフォルダを作成して、結果を保存
# =============================================================================
# 日付取得/ファイル名のため
#d_today = str(datetime.date.today())

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

# =============================================================================
# エクセルの書式設定
# =============================================================================
wb = load_workbook(filename51LC)
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')

# =============================================================================
# 【LC】LCのPeptideをリスト化(順序を優先して重複を回避)
ser_PepLC_int = df63LC['Peptide']
ser_PepLC_int2 = dict.fromkeys(ser_PepLC_int)  #LCのPeptideがリスト化できた(順番を考慮)

# ペプチドリストをもとにシートを作成
filename52LC = dirname +'LC_intact_' +xls0 + '_Pep.xlsx'
df63LC.to_excel(filename52LC)

wb = load_workbook(filename52LC)
ws = wb.active
ws.title = 'total'+'_LC_int'

for i, page in enumerate(ser_PepLC_int2):
    ws = wb.create_sheet()
    df64LC = df63LC[df63LC['Peptide'] == page]
    for row in dataframe_to_rows(df64LC,index=None, header=True):
        ws.append(row)   
        ws.title = str(page)
    
wb.save(filename52LC) #workbook保存
    
# コードの終わり