数据预处理(节选)-PDB

以下代码为个人原创,python实现,是处理PDB文件的部分常用代码,仅供参考!

1.下载PDB文件

下面是一个下载PDB文件的函数,传入的参数是一个写有pdb名字的namefile文件,函数的核心部分是三个系统命令,先通过wget下载,然后解压,最后替换名字。

def downloadpdb(namefile):
    inputfile = open(namefile, ‘r‘)
    for eachline in inputfile:
        pdbname = eachline.lower().strip()
        os.system("wget http://ftp.wwpdb.org/pub/pdb/data/structures/all/pdb/pdb" + pdbname + ".ent.gz")
        os.system("gzip -d pdb" + pdbname + ‘.ent.gz‘)
        os.system("mv pdb" + pdbname + ".ent " + pdbname.upper() + ‘.pdb‘)

测试用例

os.chdir(‘/ifs/home/liudiwei/datasets/RPdatas‘)
downloadpdb(‘protein.name‘)

2.PDB转DSSP

将下载的PDB文件转成DSSP文件

# 处理一行dssp数据
def formatdsspline(dsspline):
    eachline  = dsspline
    col = ‘\t‘ + eachline[0:5]
    col += ‘\t‘ + eachline[5:10]
    col += ‘\t‘ + eachline[10:12]
    col += ‘\t‘ + eachline[12:15]
    col += ‘\t‘ + eachline[15:25]
    col += ‘\t‘ + eachline[25:39]
    col += ‘\t‘ + eachline[29:34]
    col += ‘\t‘ + eachline[34:38]
    col += ‘\t‘ + eachline[38:50]
    col += ‘\t‘ + eachline[50:61]
    col += ‘\t‘ + eachline[61:72]
    col += ‘\t‘ + eachline[72:83]
    col += ‘\t‘ + eachline[83:92]
    col += ‘\t‘ + eachline[92:97]
    col += ‘\t‘ + eachline[97:103]
    col += ‘\t‘ + eachline[103:109]
    col += ‘\t‘ + eachline[109:115]
    col += ‘\t‘ + eachline[115:122]
    col += ‘\t‘ + eachline[122:129]
    col += ‘\t‘ + eachline[129:136]
    return col

PDB转DSSP格式,需要DSSP软件

参数:

  • pdbdir: pdb文件目录
  • dsspdir: 生成的dssp文件目录(需创建)
def pdbToDSSP(pdbnamefile,pdbdir, dsspdir):
    pdbfiles = os.listdir(pdbdir)
    #对于每个pdb文件,生成对应的dssp文件,并保存在dssp目录下
    for pdb_file in pdbfiles:
        pdb_name = pdb_file.split(‘.‘)[0].upper()
        command = ‘DSSPCMBI.EXE -x ‘ + pdbdir +‘/‘+ pdb_file + ‘  ‘+ dsspdir +"/"+ pdb_name +‘.dssp‘
        os.system(command) 

    dsspfiles = os.listdir(dsspdir)

    if os.path.exists(dsspdir + "/DSSP"):      #判断DSSP文件是否存在,存在则删除
        dsspfiles.remove("DSSP")
    output=open(dsspdir + ‘/DSSP‘,‘w‘)
    #循环读取dssp文件,将其合并成一个整的DSSP
    with open(pdbnamefile, ‘r‘) as namefile:
        for eachline in namefile:
            pdb_name = eachline.strip()
            dssp_file = pdb_name + ‘.dssp‘
        #for dssp_file in dsspfiles:
            #pdb_name = dssp_file.split(‘.‘)[0]
            with open(dsspdir + ‘/‘ + dssp_file,"r") as f:
                if not os.path.isdir(dsspdir + ‘/format‘):
                    os.mkdir(dsspdir + ‘/format‘)
                with open(dsspdir + ‘/format/‘ + pdb_name + ‘.dssp.format‘,‘w‘) as singleOut:
                    count = 0; preRes=[]
                    sets = set(‘‘);content=‘‘
                    for eachline in f.readlines():
                        list1=[];oneline=[]
                        count+=1
                        list1.append(pdb_name)
                        if count >= 29:
                            eachline = formatdsspline(eachline)
                            oneline = eachline.split(‘\t‘)

                            if oneline[3].strip():
                                preRes = oneline[3].strip()                        

                            list1.append(eachline)
                            content += "".join(list1)+‘\n‘                            

                            if ‘!‘ == oneline[4].strip():
                                continue

                            if ‘!*‘ in eachline or not oneline[3].strip():
                                if preRes in sets and len(sets):
                                    content=‘‘
                                    preRes=[]
                                    continue
                                sets.add(preRes)
                                output.write(content)
                                singleOut.write(content)
                                content=‘‘
                    if preRes and preRes not in sets:
                        output.write(content)
                        singleOut.write(content)
    output.close()

测试

#test
pdbdir = ‘z:/datasets/protein/pdb‘
dsspdir = ‘Z:/datasets/protein/DSSPdir‘
proname = ‘Z:/datasets/protein/protein.name‘
pdbToDSSP(proname,pdbdir, dsspdir)

3.DSSP抽取序列

从一个整合的DSSP文件中抽取序列文件

从格式化后的dssp文件获取序列信息

参数:dsspfile为格式过的DSSP文件,seqfile为输出的序列文件,同时输出序列文件

def getSeqFromDSSP(dsspfile, seqfile, minLen):
    with open(dsspfile, ‘r‘) as inputfile:
        if not seqfile.strip():
            seqfile = ‘protein‘+minLen + ‘.dssp.seq‘
        outchain = open(‘protein40.chain.all‘, ‘w‘)
        with open(seqfile, ‘w‘) as outputfile:
            residue=[];Ntype=[]
            preType=[];preRes=[]
            firstline=[];secondline=[];content=‘‘
            for eachline in inputfile:
                oneline = eachline.split(‘\t‘)
                residue = oneline[0]
                if not residue.strip():
                    continue
                Ntype = oneline[3].strip()
                if not Ntype.strip():
                    continue
                if preRes!=residue:
                    content = ‘‘.join(firstline)+‘\n‘ + ‘‘.join(secondline) +‘\n‘
                    if len(secondline) >=minLen and not ‘X‘ in secondline:
                        outchain.write(‘‘.join(firstline) + ‘\n‘)
                        outputfile.write(content)
                    firstline=[]
                    firstline.append(‘>‘ + residue + ‘:‘ + Ntype)
                    secondline=[];secondline.append(oneline[4].strip())
                    preRes = residue;preType = Ntype
                    continue
                if Ntype != preType:
                    content = ‘‘.join(firstline)+‘\n‘ + ‘‘.join(secondline) +‘\n‘
                    if len(secondline) >=minLen and  not ‘X‘ in secondline:
                        outchain.write(‘‘.join(firstline) + ‘\n‘)
                        outputfile.write(content)
                    firstline=[]
                    firstline.append(‘>‘ + residue + ‘:‘ + Ntype)
                    secondline=[];secondline.append(oneline[4].strip())
                    preRes = residue;preType = Ntype
                else: #如果Ntype不为空,且等于preType
                    secondline.append(oneline[4].strip())
            content = ‘‘.join(firstline)+‘\n‘ + ‘‘.join(secondline) +‘\n‘
            if len(secondline) >=minLen and not ‘X‘ in secondline:  #选择长度大于40
                outchain.write(‘‘.join(firstline) + ‘\n‘)
                outputfile.write(content)
        outchain.close()

测试:

os.chdir(r"E:\3-CSU\Academic\_Oriented\analysis\experiment\Datasets\ptest.dssp")
pdbfile = ‘DSSP‘
outfile = ‘protein.seq‘
getSeqFromDSSP(pdbfile,outfile)

4.对序列做blast聚类

设置相应的参数,在服务器上跑blast,代码如下:

ifs/share/lib/cd-hit-v4.5.4/cd-hit -i /ifs/home/liudiwei/datasets/protein40.seq -o /ifs/home/liudiwei/experiment/cdhit/fasta.40 -c 0.4 -n 2 -M 2000

5.生成聚类后的DSSP,得到protein.name、protein.seq、protein.chain三个文件

从原来的DSSP文件中,根据聚类后的链名抽取新的DSSP文件

 # extract dssp from old dssp file
def extractDSSP(dsspfile, chainname, outfile):
    with open(outfile, ‘w‘) as outdssp:
        with open(dsspfile, ‘r‘) as inputdssp:
            for eachline in inputdssp:
                oneline = eachline.split(‘\t‘)
                #preNum = oneline[2].strip()
                with open(chainname,‘r‘) as chainfile:
                    for eachchain in chainfile:
                        protein_ame = eachchain[1:5]
                        chain_id = eachchain[6:7]
                        if oneline[0].strip() == protein_ame and oneline[3].strip() == chain_id:
                            outdssp.write(eachline)
                            break

测试实例:

dsspfile = ‘/ifs/home/liudiwei/datasets/832.protein/DSSPdir1/DSSP‘
chainname = ‘/ifs/home/liudiwei/experiment/step1/832p.cluster/cdhit/protein.chain‘
outfile = ‘/ifs/home/liudiwei/experiment/step1/832p.cluster/cdhit/DSSP‘
extractDSSP(dsspfile, chainname, outfile )


本栏目持续更新中,欢迎关注:Dream_Angel_Z博客

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 13:50:34

数据预处理(节选)-PDB的相关文章

数据预处理(完整步骤)

原文:http://dataunion.org/5009.html 一:为什么要预处理数据?(1)现实世界的数据是肮脏的(不完整,含噪声,不一致)(2)没有高质量的数据,就没有高质量的挖掘结果(高质量的决策必须依赖于高质量的数据:数据仓库需要对高质量的数据进行一致地集成)(3)原始数据中存在的问题:不一致 —— 数据内含出现不一致情况重复不完整 —— 感兴趣的属性没有含噪声 —— 数据中存在着错误.或异常(偏离期望值)的数据高维度二:数据预处理的方法(1)数据清洗 —— 去噪声和无关数据(2)数

数据挖掘概念与技术读书笔记(三)数据预处理

3.1 数据预处理 数据质量的三个要素:准确性.完整性和一致性. 3.1.2 数据预处理的主要任务 数据清理:填写缺失的值,光滑噪声数据,识别或删除离群点,并解决不一致性来”清理“数据. 数据集成: 数据归约: 3.2 数据清理 3.2.1 缺失值 1.忽略元组 2.人工填写缺失值 3.使用一个全局常量填充缺失值 4.使用属性的中心度量填充缺失值:中位数 5.使用与给定元组属同一类的所有样本的属性均值或中位数 6.使用最可能的值填充缺失值:回归/贝叶斯/决策树 第6种是最流行的策略 3.2.2

《数据挖掘概念与技术》--第三章 数据预处理

一.数据预处理 1.数据如果能够满足其应用的要求,那么他是高质量的. 数据质量涉及许多因素:准确性.完整性.一致性.时效性.可信性.可解释性. 2.数据预处理的主要任务:数据清洗.数据集成.数据规约.数据变换. 二.数据清理:试图填充缺失值,光滑噪声.识别利群点.纠正数据中的不一致. 1.缺失值的处理: 1)忽略元组:缺少类标号时通常这么做.但是忽略的元组其他属性也不能用,即便是有用的. 2)人工填写:该方法很费事费时,数据集很大.缺失值很多时可能行不通. 3)使用一个全局常量填充缺失值:将缺失

WEKA中的数据预处理

数据预处理包括数据的缺失值处理.标准化.规范化和离散化处理. 数据的缺失值处理:weka.filters.unsupervised.attribute.ReplaceMissingValues. 对于数值属性,用平均值代替缺失值,对于nominal属性,用它的mode(出现最多的值)来代替缺失值. 标准化(standardize):类weka.filters.unsupervised.attribute.Standardize.标准化给定数据集中所有数值属性的值到一个0均值和单位方差的正态分布.

sklearn数据预处理-scale

对数据按列属性进行scale处理后,每列的数据均值变成0,标准差变为1.可通过下面的例子加深理解: from sklearn import preprocessing import numpy as np 测试数据: X = np.array([[1., -1., 2.], [2., 0., 0.], [0., 1., -1.]]) 使用sklearn进行scale处理时,有两种方式可供选择. 方式1:直接使用preprocessing.scale()方法: X_scaled = preproc

数据预处理技术

数据预处理技术数据清理:空缺值处理.格式标准化.异常数据清除.错误纠正.重复数据的清除数据集成:将多个数据源中的数据结合起来并统一存储,建立数据仓库的过程实际上就是数据集成.数据变换:平滑.聚集.规范化.最小 最大规范化等数据归约:维归(删除不相关的属性(维)).数据压缩(PCA,LDA,SVD.小波变换).数值归约(回归和对数线形模型.线形回归.对数线形模型.直方图)数据离散化和概念分层 1.数据清理:格式标准化.异常数据清除.错误纠正.重复数据的清除通过填写空缺值,平滑噪声数据,识别删除孤立

【机器学习】数据预处理之将类别数据转换为数值

在进行python数据分析的时候,首先要进行数据预处理. 有时候不得不处理一些非数值类别的数据,嗯, 今天要说的就是面对这些数据该如何处理. 目前了解到的大概有三种方法: 1,通过LabelEncoder来进行快速的转换: 2,通过mapping方式,将类别映射为数值.不过这种方法适用范围有限: 3,通过get_dummies方法来转换. 1 import pandas as pd 2 from io import StringIO 3 4 csv_data = '''A,B,C,D 5 1,2

第七篇:数据预处理(四) - 数据归约(PCA/EFA为例)

前言 这部分也许是数据预处理最为关键的一个阶段. 如何对数据降维是一个很有挑战,很有深度的话题,很多理论书本均有详细深入的讲解分析. 本文仅介绍主成分分析法(PCA)和探索性因子分析法(EFA),并给出具体的实现步骤. 主成分分析法 - PCA 主成分分析(principal components analysis, PCA)是一种分析.简化数据集的技术. 它把原始数据变换到一个新的坐标系统中,使得任何数据投影的第一大方差在第一个坐标(第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次

ADHD数据预处理之重采样

1.准备工作: 定义AAL模板26个小脑作为ROI: 这样得到原始91AAL  因为Mask不匹配,所以需要重采样. 2,resample 打开后,Data Directiory   选择刚得到的90AAL数据,OutputDir   选择存放数据: 这样既可得到重采样后小脑90AAL数据.以此类推,我们便可得到26个脑区AAL.用他们作为define  ROI,可以提取数据中26个小脑区时间序列 ADHD数据预处理之重采样

机器学习之数据预处理

归一化处理 from sklearn.preprocessing import StandardScaler X_scaler = StandardScaler() y_scaler = StandardScaler() X_train = X_scaler.fit_transform(X_train) y_train = y_scaler.fit_transform(y_train) X_test = X_scaler.transform(X_test) #同样的模型来训练转化测试数据 y_t