我无法使用vq.whiten
中的scipy.cluster
来规范化我的数据。我正在传递一个numpy数组,其中缺少的特征值用每个特征的平均值填充。
它被卡住的线是:
data = scipy.cluster.vq.whiten(self.imputed)
这是我用来替换丢失数据的代码。
imputed = np.array([self.masked[:,i].filled(self.masked[:,i].mean())
for i in range(np.shape(self.masked)[1])])
self.imputed = np.transpose(imputed)
我确信有更好的方法来完成这一部分,除了它似乎打破我的代码这一事实。这似乎是一种丑陋的方式,通常意味着Python有更好的方法。
我已经尝试将我发送给whiten
的数组的数量减少了,但无论我在Traceback中得到以下内容。
Traceback (most recent call last):
File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 87, in <module>
dataset.cluster()
File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 59, in cluster
data = scipy.cluster.vq.whiten(self.imputed)
File "C:\Enthought\Python27\lib\site-packages\scipy\cluster\vq.py", line 131, in whiten
std_dev = std(obs, axis=0)
File "C:\Enthought\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 2467, in std
return std(axis, dtype, out, ddof)
AttributeError: sqrt
群集在同一数据集中运行正常,没有任何数据缺失,因此我无法尝试下一步。
修改
我尝试使用以下内容打印出imputed
中每个项目的类型,包括完整数据集和缺少数据的数据集:
for item in imputed:
print type(item)
两者之间的区别在于,当没有进行均值替换和转置的版本对每行进行一次numpy.ndarray
时,被平均替换的那一个对每一列都有一个{{1}}。
答案 0 :(得分:3)
我现在已经解决了这个问题,所以我会在这里为未来失去的灵魂提供答案。问题是,当原始数据存储为float
时,我的平均替换是用numpy.float64
替换缺失值。
解决方案是运行列表推导并通过将dtype
设置为np.float64
来关注它。似乎whiten
不喜欢接收混合数据类型。
另外,为了解决在列表理解后必须转置的丑陋问题,我重新发现了np.column_stack()
。工作职能现在是:
def mean_impute(self):
imputed = np.column_stack(self.masked[:,i].filled(self.masked[:,i].mean())
for i in range(np.shape(self.masked)[1]))
self.imputed = np.array(imputed, dtype=np.float64)
已编辑添加
很久以前,但我想我会在这里更新。我现在将pandas用于数据处理,并在这种情况下使用pandas
和fill_na()
。
OP中的违规行可以替换为:
imputed = self.masked.fillna(self.masked.mean())