我试图使用sklearn.LinearRegression找到大量短序列的对数斜率。数据是从pandas dataframe的行中提取的,看起来像:
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条答案
按热度按时间pw9qyyiw1#
numpy.log10
是一个“ufunc”,并且方法Series.apply(func)
对numpy ufunc有一个特殊的测试,这使得test.apply(log10)
等价于np.log10(test)
。这意味着test
(一个PandasSeries
示例)被传递到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
。q7solyqu2#
当我使用标准差(np.std)而不是np.log10时,也出现了类似的错误消息:
'属性错误:“numpy.float64”对象没有属性“sqrt”,
尽管我之前已经通过
np.asarray(X)
将Pandas对象X转换为numpy数组。我可以通过应用上述解决方案来解决这个问题:
字符串