【问题标题】:Converting PLINK binary files into python dataframe将 PLINK 二进制文件转换为 python 数据帧
【发布时间】:2023-01-07 08:47:14
【问题描述】:
我正在处理一个遗传数据集(大约 23,000 个样本和 300,000 个 SNP 作为特征)。我的文件是 PLINK 二进制格式文件(.bed、.bim、.fam)。下面列出了它们的尺寸:
- .bed 文件:1.6G
- .bim 文件 = 9.3M
- .fam 文件 = 737K
我的目标是将它们转换为 (pandas) 数据帧,然后在 Python 中开始我的预测分析(这是一个机器学习项目)。
我被建议将所有 3 个二进制文件合并到一个 vcf(变体调用格式)文件中。使用 PLINK 软件得到的结果(vcf 文件)是一个 26G 的文件。有用于将 vcf 文件转换为 pandas 数据帧的 python 包和代码,但我的远程系统内存有限(15 Gi)。由于数据集的性质,我只能使用大学计算机。
我的问题是,考虑到我的所有局限性,如何将我的数据集转换为可用于机器学习的数据框?如果您需要更多详细信息,请告诉我。
【问题讨论】:
标签:
python
pandas
memory-management
vcf-vcard
genetics
【解决方案1】:
为什么要将其转换为 VCF?
遗憾的是,我认为您无法将整个数据集加载到 Python 中。如果每个基因型为 2 位,则 300,000 个变体的 23,000 个样本约为 1.7 GB;但是,我怀疑您的机器学习算法需要 32 位或 64 位浮点数。使用 64 位浮点数,您将需要 55 GB。
您可以尝试使用 Python 库 Hail(免责声明:我是 Hail 维护者)。您可以逐行流式传输数据。
import hail as hl
mt = hl.import_plink(bed='...bed', bim='...bim', fam='...fam')
mt.show()
您可以使用 Hail 筛选出一组较小的有用变体,然后将它们转储到您的机器学习系统中。例如,您可以过滤到相对罕见的变体:
mt = hl.variant_qc(mt)
mt = mt.filter_rows(
(mt.variant_qc.AF[0] < 0.1) | (mt.variant_qc.AF[0] > 0.9)
)
import numpy as np
dataset = np.array(hl.float(mt.GT.n_alt_alleles()).collect())