我正在尝试获取数据的日志以创建模型,但有些行中存在零值,因此log(0(的输出为-inf,这导致了一个问题。
是否有删除所有零值的更好解决方案
我的数据集是:
ds y
0 2020-01-22 0
1 2020-01-23 0
2 2020-01-24 0
3 2020-01-25 0
4 2020-01-26 0
... ... ...
353 2021-01-09 148799
354 2021-01-10 149792
355 2021-01-11 150753
356 2021-01-12 151723
357 2021-01-13 152719
您可以使用列表理解:
import pandas as pd
import numpy as np
a = pd.DataFrame({'y':[0,7,67656,15,0,2]})
print(a)
a["log"] = np.log10(a["y"])
a["log"] = [x[1] if x[0]!=0 else 0 for x in a.to_numpy()]
或者更简单:
import math
a["log"] = [math.log10(x) if x!=0 else 0 for x in a["y"]]
把你需要的东西放在其他东西之后。
这是解决问题的简单方法,可能有更复杂的方法。
你可以简单地取log(x+a)
而不是log(x)
,其中a
是一个选定的常数(或者你可以用ML行话说的超参数(,a的值可能是一个非常小的数字(例如0.00001
(,这取决于你的目标和容差。所以现在你可以计算log(0+0.00001)
而不是log(0)
,它会给出一个值-5
而不是爆炸。
正如我所说,可能有一种更聪明的方法,比如彻底理解数据,为什么0
首先存在,它们代表什么,等等
(注意:它(a
的值(不应该是很低/很小的数字,因为所有软件包/软件都有一个四舍五入级别,所以它可能会四舍五进并将您的a
变为零。(
您可能希望将numpy.log
与"其中";参数:
df['y'] = np.log(df['y'], where = df['y'] != 0)
您也可以通过以下方式进行:
mask = df['y'] != 0
valid = df.loc[mask,'y']
df['y'] = 0
df.loc[mask, 'y'] = np.log(valid)