fancyimpute Python 3 MemoryError

时间:2019-05-05 18:59:04

标签: python python-3.x pandas numpy

我有一个包含很多缺失值的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:

关于出了什么问题的任何想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我对fancyimpute并不熟悉,但是,使用pandas chunksize进行迭代可以解决与内存相关的问题。基本上,块大小为您提供了一个“ textreader对象”,您可以对其进行迭代。

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

另一个可行的选择是将数据导入7个不同的pd.Series,在每一列上执行功能,然后concat(axis = 1)创建一个DataFrame。