mcpField
P
polars-bio

polars-bio

github.com/k-dense-ai数据与数据库55.1k1.9k 次安装2 天前更新
代码仓库

关于 polars-bio

polars-bio 是一项指导使用 Polars 和 DataFusion 进行基因组区间分析及生物信息学文件读写的 skill,涵盖坐标处理、区间操作和可复现流程,并说明特定版本的限制。

主要功能

  1. 01基因组区间操作
  2. 02生物信息学文件读写
  3. 03坐标系统校验指南
  4. 04Polars 与 DataFusion 惰性流程
  5. 05测序深度分析指南

适用场景

  1. 01查找基因组区域间的重叠
  2. 02统计命中数或覆盖碱基数
  3. 03读写 VCF、BAM、FASTA 等文件
  4. 04规划可复现的基因组分析

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/k-dense-ai/scientific-agent-skills --skill polars-bio

安装后在 Claude Code 中输入/polars-bio确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
bioframe_migration.md
configuration.md
file_io.md
interval_operations.md
pileup_operations.md
sql_processing.md

详细介绍

polars-bio

通过 Polars 和 DataFusion 进行基因组区间运算和生物信息学文件 I/O 时,请使用本 skill。它面向 polars-bio 0.36.0,已在 Python 3.13 上使用 Polars 1.44.2 测试。上游包要求 Polars >=1.37.1、PyArrow >=23.0.1,<25、DataFusion >=53,<54 以及 polars-config-meta >=0.3.2,<1。请将此环境与需要不兼容的 Arrow 或 DataFusion 版本的包分开。

uv pip install "polars-bio==0.36.0" "polars==1.44.2"
# Optional pandas interoperability (requires pandas >=3):
uv pip install "polars-bio[pandas]==0.36.0" "polars==1.44.2"

请对照官方发布说明和包依赖要求验证新版本。以下带有具名文件的示例是模板:请替换为实际文件并检查其 schema。合成区间示例和本地小型格式往返转换已在此次评审期间执行。

工作流

  1. 记录组装版本、contig 命名、坐标约定、链策略和分析单元。contig 名称相同并不能证明组装版本相同。
  2. 按格式选择读取器;BCF 有自己的读取器。在选择属性或基因型之前,检查 schema 和源元数据。
  3. 将所有输入归一化到同一个坐标系,并验证其边界。
  4. 有意识地选择配对输出、命中计数、覆盖碱基或读取深度。
  5. 惰性过滤和投影,然后在扩大规模前检查一个小结果。
  6. 对照可手工计算的 fixture 验证输出计数和边界;保存结果时保留 ID、坐标元数据和来源信息。

坐标约定

默认是 1-based 闭区间,包括转换后的 BED 读取。在基因组读取器上使用 use_zero_based=True 可获得 0-based 半开区间输出。此参数会转换位置;它不只是元数据标签。例如,BED [0,10) 默认变为 [1,10],使用该覆盖选项后仍为 [0,10)。SAM 文本 POS 是 1-based,而 BAM 在内部将其比对位置存储为 0-based。两个读取器都会按请求的输出约定暴露位置。

对于手动构造的 DataFrame,元数据只是为现有数字添加标签,不会转换它们。将闭区间 [s,e] 转换为半开区间意味着 s-1,e。仅在转换后设置元数据。切勿转换两次。

import polars as pl
import polars_bio as pb

pb.set_option("datafusion.bio.coordinate_system_zero_based", True)
pb.set_option("datafusion.bio.coordinate_system_check", True)

query = pl.DataFrame({
    "query_id": ["q1", "q2", "q3"],
    "chrom": ["chr1", "chr1", "chr2"],
    "start": [0, 10, 0], "end": [10, 20, 10],
})
target = pl.DataFrame({
    "chrom": ["chr1", "chr1"], "start": [5, 8], "end": [12, 15],
})
for frame in (query, target):
    frame.config_meta.set(coordinate_system_zero_based=True)

pairs = pb.overlap(query, target).collect()
counts = pb.count_overlaps(query, target).collect().sort("query_id")
covered = pb.coverage(query, target).collect().sort("query_id")
assert pairs.height == 4
assert counts["count"].to_list() == [2, 2, 0]
assert covered["coverage"].to_list() == [5, 5, 0]

要求 contig 非空、位置为整数、区间为有效的正长度(半开形式下 0 <= start < end),并且在所选组装版本范围内。不要悄然将点/插入转换为非空区间:请选择生物学约定。输入元数据不匹配会引发 CoordinateSystemMismatchError;元数据缺失会发出警告并默认使用全局设置,或在严格模式下引发 MissingCoordinateSystemError。在转换和 SQL 之后检查 pb.get_metadata(frame)。参见配置。

选择操作

问题操作解释
哪些区间对相交?overlap(a, b)内连接配对;一个查询可能出现多次
哪些查询行有任何命中?overlap(a, b, overlap_output="left", distinct_output=True)每个原始查询行一个命中;重复输入行保留其身份
有多少目标区间与每个查询相交?count_overlaps(a, b)目标记录数,包括无命中时的零
有多少查询碱基被覆盖?coverage(a, b)目标交集并集的长度;不是读取深度
哪些目标最近?nearest(a, b, k=1)最多 k 个邻居,无候选时目标/距离可为空
合并重叠区域merge(a)坐标加 n_intervals;其他注释不聚合
标记重叠组cluster(a)添加 cluster、cluster_start、cluster_end
查找未覆盖区域complement(a, view_df=genome)显式装配边界内的间隙
移除目标覆盖的部分subtract(a, b)剩余的坐标片段;源注释不保留

重要的 0.36.0 行为:

  • on_cols 在多个签名中暴露但未实现;非 None 值会引发 AssertionError。对于链/样本特定分析,按该键拆分两个 输入,分别运行匹配组并恢复组键。
  • merge(..., min_dist=0) 和 cluster(..., min_dist=0) 保持首尾相接的半开 区间分离。min_dist=1 为整数坐标连接首尾。移植 bioframe 代码时测试 边界夹具;其阈值约定不同。
  • nearest 支持 k、overlap=False 和 distance=False。距离零可能 意味着重叠或邻接;它不能证明有相交碱基。不要 从任意等距候选中推断唯一的生物学注释。
  • 默认 COITrees 重叠索引将坐标转换为有符号 Int32;Int64 DataFrame 不能消除 2,147,483,647 限制。在执行前验证最大坐标, 尤其是拼接基因组或自定义坐标空间。
  • 无视图的 complement 使用实际上无界的 contig 范围。始终 提供有限基因组边界,并确保其约定与区间匹配。

函数式区间调用默认返回 pl.LazyFrame;.collect() 或 output_type="polars.DataFrame" 给出急切结果。.pb 区间访问器 在 LazyFrame 上:query.lazy().pb.overlap(target).collect()。DataFrame .pb 提供写入方法。请参阅 区间操作。

读取、查询和写入文件

对惰性计划使用 scan_*,对立即读取使用 read_*。它们不保证每个阶段、连接索引或最终结果都能容纳在有限内存中。

# Template: both files use the same assembly; coordinates become half-open.
peaks = pb.scan_bed("peaks.bed", use_zero_based=True)
variants = pb.scan_vcf("cohort.vcf.gz", use_zero_based=True,
                       info_fields=[], format_fields=[])
hits = pb.overlap(peaks, variants).collect(engine="streaming")

分析前请检查以下格式特有的差异:

  • read_bed/scan_bed 暴露 BED4 字段。BED3 会产生空名称;BED6/12 的额外字段不会被保留。对于链/块字段,请使用 scan_table(..., schema="bed6") 或带显式 schema 的 Polars CSV,然后附加坐标元数据。
  • 文本 VCF 使用 read_vcf/scan_vcf;二进制 BCF 使用 read_bcf/scan_bcf。INFO 默认使用头部定义的列,而不是原始的 info 字符串。单样本 FORMAT 会被展平;多样本 FORMAT 是列表的 genotypes 结构体。
  • GFF/GTF 的 attributes 是结构化的。使用 attr_fields 请求实际的注释键,然后筛选具名列。FASTQ 将其质量字符串称为 quality_scores,而不是 quality。
  • BAM/CRAM 可以在没有索引的情况下扫描;索引可实现选择性/并行读取。当需要外部参考时,read_cram/scan_cram 接受带 .fai 的本地 reference_path。register_cram 和 depth 缺少该参数,需要自包含的参考安排。
  • 原生写入器/sink 适用于 VCF、BAM、SAM、CRAM、FASTA 和 FASTQ。在转换过程中保留格式头部和元数据;仅写入选定的坐标列不是有效的完整格式往返。

有关当前 schema、压缩、云凭证、输出保真度和仅本地的 VCF Zarr 读取器,请参阅文件 I/O。

SQL 注册先使用路径,再使用表名。register_fasta 存在于 0.36.0 中。from_polars(name, frame) 注册 Polars 数据;register_view(name, sql) 接受 SQL 文本。pb.sql(query) 返回 LazyFrame。在注册基因组文件之前,请显式设置会话坐标约定,并在 SQL 之后重新附加已确认的坐标元数据(如果缺失)。0.36.0 的 SQL 区间连接优化器存在 dtype 和未匹配行缺陷;请使用经过测试的区间 API,而不是假设 SQL LEFT JOIN 语义。请参阅 SQL。

读取深度是单独的测量

pb.depth("sample.bam", use_zero_based=True) 返回游程块;当 contig 长度支持密集累积时,per_base=True 会输出位置。M、= 和 X 贡献覆盖度;D 和 N 不贡献。默认 flag 掩码 1796 会排除未映射、次要、QC 失败和重复读段,但不会排除补充读段。此 API 中没有碱基质量阈值或片段计数选项。

深度以 Int16 输出。在 0.36.0 中,覆盖一个碱基的 32,768 条读段会回绕为 -32,768;事后转换结果无法恢复它。在没有独立深度实现的情况下,请勿将此函数用于超深数据。使用长度加权的块摘要,并将零深度目标碱基计入分母。有关经过测试的摘要模式,请参阅 pileup 操作。

扩展与可复现性

保持查询/目标顺序在生物学上正确:交换输入会改变计数、覆盖度、最近邻和减法结果。第二个输入会为许多 join 建立索引,但默认的 count_overlaps 会在内部交换操作数。应对实际执行的操作进行基准测试,而不是遵循通用的“较大者优先”规则。

惰性扫描可以将支持的过滤/投影下推到读取器;BED 和 FASTA 无法提供与带索引的 VCF/BAM 相同的下推能力。collect(engine="streaming") 仍会物化最终的 DataFrame。对大型输出使用 sink,并为构建索引、排序、聚合和密集 pileup 数组预留内存。先从默认的单个 DataFusion 分区开始,再根据实测吞吐量和内存调整一个较小的固定数量。记录版本、选项、组装版本、输入校验和、过滤规则、行数和区间覆盖度总计。

云读取使用特定于格式的 OpenDAL 选项,而不是通用的 Polars storage_options 字典。仅针对相关 URI 请求经过身份验证/特定于提供商的功能;云访问经过了文档审查,而执行了一个小型公共 HTTPS BED 扫描。未测试经过身份验证的 S3/GCS/Azure 服务。排查问题时请说明这一区别。

有关语义检查,请参阅 bioframe 迁移;polars-bio 并非可直接替换。上游基准测试的加速是特定于数据集、硬件和操作的,并不是性能承诺。

引用 Scientific Agent Skills

本技能是 K-Dense 的 Scientific Agent Skills 的一部分。如果它对手稿、报告、演示或代码发布有实质性贡献,请将该论文添加到参考文献或软件部分,并告知用户你已这样做:

Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065

始终引用当前版本。DOI 和 https://arxiv.org/abs/2609.00065 会解析到最新的 arXiv 版本,因此切勿附加诸如 v1 之类的版本后缀。当网络访问可用时,在撰写参考文献之前获取 https://arxiv.org/abs/2609.00065(或 http://export.arxiv.org/api/query?id_list=2609.00065),并从该记录中获取作者列表、年份和版本。如果该记录列出了期刊参考文献或出版商 DOI,请改为引用已发表的版本。

评论

支持 Markdown