wf-transcriptomes-v202/bin/workflow_glue/merge_count_tsvs.py
Neil Horner d8d8a791af Glue
2023-02-24 14:42:57 +00:00

63 lines
1.9 KiB
Python
Executable File

#!/usr/bin/env python
"""Merge salmon output count files."""
from functools import reduce
import numpy as np
import pandas as pd
from .util import wf_parser # noqa: ABS101
def argparser():
"""Argument parser for entrypoint."""
parser = wf_parser("merge_count_tsvs")
parser.add_argument(
'-j', metavar='join', help="Join type (outer).", default="outer")
parser.add_argument(
'-f', metavar='field',
help="Join on this field (Reference).", default="Reference")
parser.add_argument(
'-o', metavar='out_tsv',
help="Output tsv (merge_tsvs.tsv).", default="merge_tsvs.tsv")
parser.add_argument(
'-z', action="store_true",
help="Fill NA values with zero.", default=False)
parser.add_argument(
'-tpm', type=bool, default=False,
help="TPM instead of counts")
parser.add_argument(
'-tsvs', metavar='input_tsvs', nargs='*',
help="Input tab separated files.")
return parser
def main(args):
"""Run entry point."""
dfs = {x: pd.read_csv(x, sep="\t") for x in args.tsvs}
ndfs = []
for x, df in dfs.items():
# Transform counts to integers:
if args.tpm:
df = df.rename(columns={'TPM': 'Count', 'Name': 'Reference'})
else:
df = df.rename(columns={'NumReads': 'Count', 'Name': 'Reference'})
df.Count = np.array(df.Count, dtype=int)
# Take only non-zero counts:
df = df[df.Count > 0]
df = df[["Reference", "Count"]]
df = df.sort_values(by=["Count"], ascending=False)
name = x.split('.')[0]
df = df.rename(columns={'Count': name})
ndfs.append(df)
dfs = ndfs
df_merged = reduce(lambda left, right: pd.merge(
left, right, on=args.f, how=args.j), dfs)
if args.z:
df_merged = df_merged.fillna(0)
df_merged.to_csv(args.o, sep="\t", index=False)