необычный Python 3 MemoryError - PullRequest
1 голос
/ 05 мая 2019

У меня есть CSV-файл, содержащий множество пропущенных значений. Я пытаюсь использовать пакет 'fancyimpute' для вменения пропущенных значений, используя метод 'KNN ()'.

DataFrame pandas, содержащий CSV-файл, имеет 7 атрибутов / столбцов, а 8-й атрибут, который является «временем», но используется в качестве индекса для DataFrame.

data.shape

# (83070, 7)

data.isnull (). Сумма (). Сумма ()

# 59926

data.isnull (). Сумма ()

'''
A        171
B        0
C        0
D        47441
E        170
F        12144
G        0
dtype: int64
'''

Когда я использую следующий код для вменения данных-

filled_data_na = KNN(k = 3).fit_transform(data)

Это дает мне следующую ошибку-

MemoryError Traceback (самый последний вызов последний) в ----> 1 заполнено_на = KNN (k = 3) .fit_transform (data_date_idx)

~ / .local / lib / python3.6 / site-packages / fancyimpute / solver.py в fit_transform (self, X, y) 187 тип (X_filled))) 188 -> 189 X_result = self.solve (X_filled, missing_mask) 190, если не isinstance (X_result, np.ndarray): 191 повышение TypeError (

~ / .local / lib / python3.6 / site-packages / fancyimpute / knn.py в resol (self, X, пропущенная маска) 102 k = self.k, 103 verbose = self.verbose, -> 104 print_interval = self.print_interval) 105 106 failed_to_impute = np.isnan (X_imputed)

~ / .local / Библиотека / python3.6 / сайт-пакеты / knnimpute / few_observed_entries.py в knn_impute_few_observed (X, пропущенная маска, k, подробный, print_interval) 49 X_column_major = X.copy (order = "F") 50 X_row_major, D ,ffective_infinity = \ ---> 51 knn_initialize (X, missing_mask, verbose = verbose) 52 # избавиться от бесконечностей, заменить их на очень большое количество 53 D_sorted = np.argsort (D, ось = 1)

~ / .local / lib / python3.6 / site-packages / knnimpute / common.py в knn_initialize (X, пропущенная маска, многословный, min_dist, max_dist_multiplier) 37 # положить обратно NaN в матрицу данных для функции расстояний 38 X_row_major [missing_mask] = np.nan ---> 39 D = all_pairs_normalized_distances (X_row_major) 40 D_finite_flat = D [np.isfinite (D)] 41 if len (D_finite_flat)> 0:

~ / .local / Библиотека / python3.6 / сайт-пакеты / knnimpute / normalized_distance.py в all_pairs_normalized_distances (X) 36 37 # матрица среднего квадрата разницы между образцами ---> 38 D = np.ones ((n_rows, n_rows), dtype = "float32", order = "C") * np.inf 39 40 # мы можем дешево определить количество столбцов, которые разделяют две строки

~ / .local / lib / python3.6 / site-packages / numpy / core / numeric.py в единицы (форма, тип, порядок) 221 222 "" " -> 223 a = пусто (форма, тип, порядок) 224 multiarray.copyto (a, 1, casting = 'unsafe') 225 возврат

MemoryError:

Есть идеи, что не так?

Спасибо!

1 Ответ

1 голос
/ 05 мая 2019

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

for chunk in pd.read_csv('my_csv.csv', chunksize=1000):

Другой вариант, который может сработать, это импортировать данные в 7 различных pd.Series, выполнять свои функции для каждого столбца, а затем выполнять concat (axis = 1) для создания DataFrame.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...