AttributeError:'numpy.float64'对象没有属性'log10'

时间:2017-11-09 17:51:32

标签: python numpy

我试图使用sklearn.LinearRegression找到大量短序列的对数斜率。数据是从pandas数据帧的行中提取出来的,如下所示:

bp01    1.12
bp02    1.12
bp03    1.08
bp04    0.99
bp05    1.08
bp06    1.19
bp07    1.17
bp08    1.05
bp09     0.8
bp10    0.96
bp11    0.97
bp12    1.12
bp13    0.91
bp14    0.96
bp15    1.05
bp16    0.93
bp17    0.97
bp18    0.92
bp19    0.89
bp20       0
Name: 42029, dtype: object

但是,当我尝试使用np.log10时,在系列中我收到以下错误:

In[27]: test.apply(np.log10)
Traceback (most recent call last):

  File "<ipython-input-27-bccff3ed525b>", line 1, in <module>
    test.apply(np.log10)

  File "C:\location", line 2348, in apply
    return f(self)

AttributeError: 'numpy.float64' object has no attribute 'log10'

我不确定为什么会出现这个错误,np.log10应该与我看到的numpy.float64一起使用。想法?

2 个答案:

答案 0 :(得分:5)

numpy.log10是一个“ufunc”,方法Series.apply(func)对numpy ufunc进行了特殊测试,使test.apply(log10)等同于np.log10(test)。这意味着test,一个Pandas Series实例,将传递给log10test的数据类型为object,这意味着test中的元素可以是任意Python对象。 np.log10不知道如何处理这样的对象集合(它不“知道”那些对象实际上是所有np.float64个实例),所以它试图将计算分派给Series中的各个元素。为此,它希望元素本身具有log10方法。发生错误时:Series(在本例中为np.float64个实例)中的元素没有log10方法。

一个应该做你想做的事情的替代表达是np.log10(test.astype(np.float64))test.astype(np.float64).apply(np.log10)。关键部分是test.astype(np.float64)Series对象的数据类型从object转换为np.float64

答案 1 :(得分:0)

使用标准偏差(np.std)而不是np.log10时,我也收到类似的错误消息:

  

'AttributeError:'numpy.float64'对象没有属性'sqrt',

,尽管我之前已经通过np.asarray(X)将Pandas对象X转换为numpy数组。

我可以通过应用上述解决方案来解决此问题:

X = pd.read_excel('file.xls')
Y = np.asarray(X).astype(np.float64)
Z = np.std(Y,axis=0)