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

バイオとDX

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

# =============================================================================
# Modificationのフィルタリング
# =============================================================================
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

# 配列入力
seq = 'ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0ABCDEFGHIJKLMNOPQRS0'


# 元になるエクセルファイルを読み込み
xls = 'bpv.xlsx'
  
# エクセルの所定のシートを指定して、データフレームに読み込む
df = pd.read_excel(xls, sheet_name='Matched')

df2 = df.rename(columns={'Chain Names':'ChainNames'})

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

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

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

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

# ■ 基準4/9 ■ Modificationsが空欄のものは除外 ←DeamidatedとOxidation検出するので不要になった
#df4 = df3[pd.notnull(df3['Modifications']) == True]
 
# ■ 基準5/9 ■ 
#Modificationsで、表記が1つだけのものを抽出
#ただし、('Carboxymethyl'はカウントに入れない)
#いずれかの意、「or」としたいなら、「Ca|a2|m5|g0|g1|g2」 を使うこと

#Targetを規定
De = 'Deamidated'
#Ox = 'Oxidation'
#Ca = 'Carboxymethyl'
#a2 = 'A2G1'
#m5 = 'M5'
#g0 = 'G0'
#g1 = 'G1'
#g2 = 'G2'

#方法a)項目にて、DeamidatedとOxidationの合計が1つだけのもののみ抽出
#なお、糖鎖のものを検出するなら改変必要
df2 = df2[df2['Modifications'].str.count(De)  == 1]

#方法b)項目数総数からCarboxymethylを除いた総数が1つのみ抽出
#df5 = df4[df4['Modifications'].str.count(',') + 1 - df4['Modifications'].str.count('Carboxymethyl') == 1]

# =============================================================================
# Modifictionを1つにする
# =============================================================================
# Deamiか、あるいは、Oxidationを含むものだけにして、あとはすべて除去する

df3 = df2['Modifications']

li_modi1 = []
li_deam = []

for i, deam in enumerate(df3):
    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

df2['Modifications1'] = li_deam

# =============================================================================
# Modifictionを1つにする
# =============================================================================

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

# dfの中を表示する
#print('')
#print('--- dataframe ---')
#print(df)

# Modificationに記された、(1)記述, (2)ペプチド番号、(3)アミノ酸番号に分解する。

#df4 = df3['Modifications1']
#print(df2)

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

for i, AAA in enumerate(df):
    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[int(BBB1[2])] #文字列の要素にアクセスしようとした際に、その要素が存在しない場合に発生するエラーです。
        An.append(An1) 

    else:
        An1 = 'X'  #BBB1の表記が足らないで、割り当てられていないときは、アミノ酸 X を割り当てる
        An.append(An1)
        
    AnAAn.append(str(An1)+str(AAn1))

               
df2['Modifications_Aaa'] = Aaa
df2['Modifications_PPn'] = PPn
df2['Modifications_AAn'] = AAn
df2['Modifications_An'] = An
df2['Modifications_AnAAn'] = AnAAn
    
# =============================================================================
# 日付を得て、ディレクトリにフォルダを作成して、結果を保存
# =============================================================================

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

# ディレクトリにフォルダ作成
dirname = d_today+'_pep'+'/'
if not os.path.exists(dirname):
    os.mkdir(dirname)   
    
# エクセルとして保存
filename2 = dirname +'_pep2.xlsx'
df2.to_excel(filename2)

# =============================================================================
# エクセルの書式設定
# =============================================================================
wb = load_workbook(filename2)
ws = wb.active
ws.title = 'Deamidated' #シート名を変更

# 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(filename2)


# コードの終わり