python - fancyimpute Python 3 MemoryError
问题描述
我有一个包含大量缺失值的 CSV 文件。我正在尝试使用 'fancyimpute' 包使用 'KNN()' 方法来估算缺失值。
包含 CSV 文件的 pandas DataFrame 有 7 个属性/列,而第 8 个属性是“时间”,但用作 DataFrame 的索引。
数据形状
# (83070, 7)
data.isnull().sum().sum()
# 59926
data.isnull().sum()
'''
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 (最近一次调用最后一次) in ----> 1filled_na = KNN(k = 3).fit_transform(data_date_idx)
~/.local/lib/python3.6/site-packages/fancyimpute/solver.py in fit_transform(self, X, y) 187 type(X_filled))) 188 --> 189 X_result = self.solve(X_filled, missing_mask ) 190 if not isinstance(X_result, np.ndarray): 191 raise TypeError(
~/.local/lib/python3.6/site-packages/fancyimpute/knn.py in solve(self, X, missing_mask) 102 k=self.k, 103 verbose=self.verbose, --> 104 print_interval=self .print_interval) 105 106 failed_to_impute = np.isnan(X_imputed)
~/.local/lib/python3.6/site-packages/knnimpute/few_observed_entries.py 在 knn_impute_few_observed(X, missing_mask, k, verbose, print_interval) 49 X_column_major = X.copy(order="F") 50 X_row_major, D , effective_infinity = \ ---> 51 knn_initialize(X, missing_mask, verbose=verbose) 52 # 去掉无穷大,用一个很大的数替换它们 53 D_sorted = np.argsort(D, axis=1)
~/.local/lib/python3.6/site-packages/knnimpute/common.py in knn_initialize(X, missing_mask, verbose, 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 如果 len(D_finite_flat) > 0:
~/.local/lib/python3.6/site-packages/knnimpute/normalized_distance.py in 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 in one(shape, dtype, order) 221 222 """ --> 223 a = empty(shape, dtype, order) 224 multiarray.copyto(a, 1, cast='unsafe') 225 返回一个
内存错误:
关于出了什么问题的任何想法?
谢谢!
解决方案
我对fancyimpute不太熟悉,但是,使用pandas chunksize进行迭代,可以解决与内存相关的问题。基本上,块大小为您提供了一个可以迭代的“文本阅读器对象”。
for chunk in pd.read_csv('my_csv.csv', chunksize=1000):
另一个可行的选择是将数据导入 7 个不同的 pd.Series,在每一列上执行你的函数,然后 concat (axis=1) 创建一个 DataFrame。
推荐阅读
- python - 类型错误:需要整数参数
- reactjs - 堆栈中嵌套抽屉时不显示屏幕标题
- sqlite - 使用 Xamarin.Forms 从 Sqlite 数据库中获取数据
- asp.net - 如何使用 ASP.NET 在解决方案中存储图像?
- php - 在 Woocommerce 中发送特定运输方式的订单保留电子邮件
- java - 是否可以将 LibGDX 与 MoltenGL 一起使用
- css - 边距样式在 Angular 和 Bootstrap 中不起作用
- video - 获取生成缩略图的第二个
- angular - templateUrl 按角度 4 中的类动态
- javascript - 如何获取 post 变量