用户工具

站点工具


获得lefsebiomaker的丰度

biomarkerFromLefse

介绍

通过fuzzywuzzy库对lefse中获得的Biomaker在对应的丰度表格中进行查找匹配,解决lefse自身处理数据的改名问题

参考路径 : /TJPROJ5/META_ASS/script/yuxi/script/mediation

/TJPROJ7/META_ASS/16s/yuxi/X101SC21124468-Z01/X101SC21124468-Z01-mediation

软件架构

使用python 3.10.0

fuzzywuzzy 0.18.0

python-Levenshtein 0.23.0 (fuzzywuzzy库使用了纯Python实现的SequenceMatcher,这在处理大量数据时可能会变得比较慢。为了提高性能,可以安装python-Levenshtein库,它是fuzzywuzzy的一个可选依赖项,提供了更快的SequenceMatcher实现)

使用说明

准备好LDA.control-disease.draw.res文件, 该文件由5列数据组成

第一列:Biomaker名称;

第二列:各组分丰度平均值中最大值的log10,如果平均丰度小于10的按照10来计算;

第三列:差异物种富集的组名;

第四列:LDA值;

第五列:Kruskal-Wallis秩和检验的值,若不是Biomarker用“—”表示。

对该数据列进行处理获得Biomaker后,与每个物种层级的相对丰度表格进行比较,查找对应名称的丰度内容信息并整合输出

配置好文件名称后,执行main.py脚本(或python3 main_command_line.py res featureTable_Relative)即可,cosSimilarity.py是使用余弦值相似性算法进行比对,但是对特殊字符处理不敏感,不建议使用

ps:如果筛选的Biomaker比res文件中的少,那说明使用fuzzywuzzy进行相似性比对时阈值设置高了,默认我设置90%,基本能涵盖大部分的特殊字符及模糊或错误匹配的部分,可以适当调小

main.py

import glob
from fuzzywuzzy import fuzz

selectSpecies = []
num = 0
with open('LDA.control-disease.draw.res', 'r') as file:
    for line in file:
        columns = line.strip().split('\t')
        if len(columns) >= 5 and all(columns[1:5]):
            species = columns[0].split('.')[-1]
            selectSpecies.append(species)
            num += 1

# list(map(lambda x: print(x), selectSpecies))

files = glob.glob('featureTable_Relative/featureTable.sample.*.relative.xls')
if len(files) > 0:
    first_file = files[0]
    with open(first_file, 'r') as file:
        for line in file:
            title = line
            break

checknum = 0
with open("Biomaker.txt", "w") as out_file:
    out_file.write(title)
    for species in selectSpecies:
        level = species[0]
        name = species[3:]
        filename = f"featureTable_Relative/featureTable.sample.{level}.relative.xls"
        with open(filename, "r") as in_file:
            for line in in_file:
                name_to_compare = line.split("\t")[0]
                similarity = fuzz.ratio(name, name_to_compare)
                threshold = 90
                if similarity >= threshold:
                    #print(f"{name} and {name_to_compare} are similar,Similarity score: {similarity}%.")
                    out_file.write(f"{level}__{line}")
                    checknum += 1
                    break

if num != checknum:
   print(f"Biomaker 的个数是 {num} 与比对删选后的的物种个数{checknum} 不同,适当降低相似度阈值\n") 
else:
    print("生成Biomaker成功!")

out_file.close()

main_command_line.py

import glob
from fuzzywuzzy import fuzz
import sys

resfile = sys.argv[1]
path = sys.argv[2]

selectSpecies = []
num = 0
with open(resfile, 'r') as file:
    for line in file:
        columns = line.strip().split('\t')
        if len(columns) >= 5 and all(columns[1:5]):
            species = columns[0].split('.')[-1]
            selectSpecies.append(species)
            num += 1

# list(map(lambda x: print(x), selectSpecies))

files = glob.glob(f'{path}/featureTable.sample.*.relative.xls')
if len(files) > 0:
    first_file = files[0]
    with open(first_file, 'r') as file:
        for line in file:
            title = line
            break

checknum = 0
with open("Biomaker.txt", "w") as out_file:
    out_file.write(title)
    for species in selectSpecies:
        level = species[0]
        name = species[3:]
        filename = f"{path}/featureTable.sample.{level}.relative.xls"
        with open(filename, "r") as in_file:
            for line in in_file:
                name_to_compare = line.split("\t")[0]
                similarity = fuzz.ratio(name, name_to_compare)
                threshold = 90
                if similarity >= threshold:
                    #print(f"{name} and {name_to_compare} are similar,Similarity score: {similarity}%.")
                    out_file.write(f"{level}__{line}")
                    checknum += 1
                    break

if num != checknum:
   print(f"Biomaker 的个数是 {num} 与比对删选后的的物种个数{checknum} 不同,适当降低相似度阈值\n") 
else:
    print("生成Biomaker成功!")

out_file.close()
获得lefsebiomaker的丰度.txt · 最后更改: 2023/10/17 09:48 由 yuxi