我有一个包含很多缺失值的CSV文件。我正在尝试使用'fancyimpute'包通过'KNN()'方法估算缺失值。
包含CSV文件的pandas DataFrame具有7个属性/列,而第8个属性是“时间”,但用作DataFrame的索引。
data.shape
# (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跟踪(最近的调用) 最后) ----> 1 fill_na = 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 insolve(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,有效无穷大= ---> 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,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 在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在 一个(形状,dtype,顺序) 221 222“”“ -> 223 a =空(形状,dtype,顺序) 224 multiarray.copyto(a,1,cast ='unsafe') 225返回a
MemoryError:
关于出了什么问题的任何想法吗?
谢谢!
答案 0 :(得分:0)
我对fancyimpute并不熟悉,但是,使用pandas chunksize进行迭代可以解决与内存相关的问题。基本上,块大小为您提供了一个“ textreader对象”,您可以对其进行迭代。
for chunk in pd.read_csv('my_csv.csv', chunksize=1000):
另一个可行的选择是将数据导入7个不同的pd.Series,在每一列上执行功能,然后concat(axis = 1)创建一个DataFrame。