我试图使用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一起使用。想法?
答案 0 :(得分:5)
numpy.log10
是一个“ufunc”,方法Series.apply(func)
对numpy ufunc进行了特殊测试,使test.apply(log10)
等同于np.log10(test)
。这意味着test
,一个Pandas Series
实例,将传递给log10
。 test
的数据类型为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)