Python - определение функции чанка для кодирования данных genomi c - PullRequest
0 голосов
/ 10 февраля 2020

Я пытаюсь кодировать геномы из строк, хранящихся в кадре данных, в массив соответствующих числовых значений.

Вот некоторые из моих данных (по некоторым причинам он не дает мне все 5 столбцов только 2):

Antibiotic  ...                                             Genome
0       isoniazid  ...  ccctgacacatcacggcgcctgaccgacgagcagaagatccagctc...
1       isoniazid  ...  gggggtgctggcggggccggcgccgataaccccaccggcatcggcg...
2       isoniazid  ...  aatcacaccccgcgcgattgctagcatcctcggacacactgcacgc...
3       isoniazid  ...  gttgttgttgccgagattcgcaatgcccaggttgttgttgccgaga...
4       isoniazid  ...  ttgaccgatgaccccggttcaggcttcaccacagtgtggaacgcgg...

Так что мне нужно разделить эти строки символ за символом и назначить их плавать. Это таблица поиска, которую я использовал:

lookup = {
  'a': 0.25,
  'g': 0.50,
  'c': 0.75,
  't': 1.00
  # z: 0.00
}

Я пытался применить это напрямую, используя:

dataframe['Genome'].apply(lambda bps: pd.Series([lookup[bp] if bp in lookup else 0.0 for bp in bps.lower()])).values

Но у меня слишком много данных, чтобы поместиться в память, поэтому я пытаюсь обрабатывать с помощью кусков, и у меня возникают проблемы с определением функции повторной обработки.

Вот мой код:

lookup = {
  'a': 0.25,
  'g': 0.50,
  'c': 0.75,
  't': 1.00
  # z: 0.00
}


dfpath = 'C:\\Users\\CAAVR\\Desktop\\Ison.csv'
dataframe = pd.read_csv(dfpath, chunksize=10)

chunk_list = []
def preprocess(chunk):
  chunk['Genome'].apply(lambda bps: pd.Series([lookup[bp] if bp in lookup else 0.0 for bp in bps.lower()])).values
  return;


for chunk in dataframe:
  chunk_filter = preprocess(chunk)
  chunk_list.append(chunk_filter)
  dataframe1 = pd.concat(chunk_list)

print(dataframe1)

Заранее спасибо!

1 Ответ

1 голос
/ 10 февраля 2020

У вас есть chunk_filter = preprocess(chunk), но ваша функция preprocess() ничего не возвращает, поэтому chunk_filter всегда бессмысленно. Измените функцию предварительной обработки, чтобы сохранить результат вызова apply(), а затем верните это значение. Например:

def preprocess(chunk):
  processed_chunk = chunk['Genome'].apply(lambda bps: pd.Series([lookup[bp] if bp in lookup else 0.0 for bp in bps.lower()])).values
  return processed_chunk;

Делая это, вы фактически возвращаете данные из функции предварительной обработки, чтобы их можно было добавить в список чанков. Как и сейчас, функция предварительной обработки работает корректно, но по существу отбрасывает результаты.

...