Я написал скрипт Pandas, применяя математическую функцию к каждой строке в кадре данных Pandas, как показано ниже:
import pandas as pd
import sys
numbers = pd.read_csv(sys.argv[1], sep="\t", header=None)
combinations = pd.read_csv(sys.argv[2], sep=" ", header=None)
pop = int(int(sys.argv[4]) + 5)
def score_freq(line):
score=0
freq=1
for j in range(len(line)):
if line[j][1] != numbers.values[j][1]: # homozygous for ref
score+=0
freq*=(float(1-float(numbers.values[j][pop]))*float(1-float(numbers.values[j][pop])))
elif line[j][0] != numbers.values[j][1] and line[j][1] == numbers.values[j][1]: # heterozygous
score+=(float(numbers.values[j][5]))
freq*=(2*(float(1-float(numbers.values[j][pop]))*float(numbers.values[j][pop])))
elif line[j][0] == numbers.values[j][1]:
score+=2*(float(numbers.values[j][5]))
freq*=(float(numbers.values[j][pop])*float(numbers.values[j][pop]))
if freq < sys.argv[3]: # threshold to stop loop in interest of efficiency
break
return pd.Series([score, freq])
combinations[['score', 'freq']] = combinations.apply(lambda row: score_freq(row), axis=1)
combinations.to_csv(sys.argv[5], index=False, header=False)
Входной файл для «чисел» таков:
SNP1 A T 1.25 0.223143551314 0.97273
SNP2 C G 1.07 0.0676586484738 0.3
SNP3 T A 1.08 0.0769610411361 0.1136
В то время как ввод для «комбинаций» таков:
AA CC TT
AT CC TT
TT CC TT
AA CG TT
AT CG TT
TT CG TT
AA GG TT
AT GG TT
TT GG TT
AA CC TA
AT CC TA
TT CC TA
AA CG TA
AT CG TA
TT CG TA
AA GG TA
AT GG TA
TT GG TA
AA CC AA
AT CC AA
TT CC AA
AA CG AA
AT CG AA
TT CG AA
AA GG AA
AT GG AA
TT GG AA
Переменная «pop» предназначена для обработки дополнительных столбцов, которые могут присутствовать во входной таблице «numbers», поскольку дополнительные столбцы будут представлять частоты для дополнительных групп.
Проблема, с которой я здесь сталкиваюсь, заключается в том, что при запуске моего скрипта в Windows это занимает менее секунды, но оно застревает при запуске его на моем Unix-сервере. Я позволил программе работать более 30 минут, но она не завершается.
Самый последний звонок:
combinations[['score', 'freq']] = combinations.apply(lambda row: score_freq(row), axis=1)
Кто-нибудь знает, что происходит?