Python - список чанков в кадре данных после обработки - PullRequest
1 голос
/ 11 февраля 2020

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

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

MemoryError: Unable to allocate array with shape (414, 100, 32765) and data type float64

Вот мои данные:

 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,
  '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=100)

chunk_list = []
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;


for chunk in dataframe:
  chunk_filter = preprocess(chunk)
  chunk_list.append(chunk_filter)
  chunk_array = np.asarray(chunk_list)

for chunk in chunk_array:
  dataframe1 = dataframe.copy()
  dataframe1["Chunk"] = chunk_array


dataframe1.to_csv(r'C:\\Users\\CAAVR\\Desktop\\chunk.csv')

Если вам нужна дополнительная информация дай мне знать. Спасибо

1 Ответ

0 голосов
/ 12 февраля 2020

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

Если вы открываете файл в режиме добавления (f = open('out.csv', 'a')), вы можете сделать dataframe.to_csv(f) несколько раз. Когда он в первый раз будет писать столбцы, последующие вызовы будут делать dataframe.to_csv(f, header=False), так как вы уже написали заголовки столбцов ранее.

...