这是一个示例数据,即使没有负数或 np.nan,它仍然显示错误消息:
数据:
gvkey sale ebit
4 1000 44.8 16.8
5 1000 53.2 11.5
6 1000 42.9 6.2
7 1000 42.4 0.9
8 1000 44.2 5.3
9 1000 51.9 9.7
功能:
def calculate_ln_values(df):
conditions_ebit = [
df['ebit'] >= 0.0,
df['ebit'] < 0.0
]
choices_ebit = [
np.log(1 + df['ebit']),
np.log(1 - df['ebit']) * -1
]
df['lnebit'] = np.select(conditions_ebit, choices_ebit, default=np.nan)
conditions_sale = [
df['sale'] >= 0.0,
df['sale'] < 0.0
]
choices_sale = [
np.log(1 + df['sale']),
np.log(1 - df['sale']) * -1
]
df['lnsale'] = np.select(conditions_sale, choices_sale, default=np.nan)
return df
跑步
calculate_ln_values(data)
错误警告:
C:\Users\quoc\anaconda3\envs\uhart\Lib\site-packages\pandas\core\arraylike.py:399: RuntimeWarning: invalid value encountered in log
result = getattr(ufunc, method)(*inputs, **kwargs)
C:\Users\quoc\anaconda3\envs\uhart\Lib\site-packages\pandas\core\arraylike.py:399: RuntimeWarning: invalid value encountered in log
result = getattr(ufunc, method)(*inputs, **kwargs)
如果有人能帮助我解决这个问题我将非常感激
---- 编辑:回复@Emi OB 和@Quang Hoang 的回答:-----------
论文中的公式是:
如果 EBIT ≥ 0,则 ln(1+EBIT)
如果 EBIT < 0,则为 -ln(1-EBIT)
所以我的代码:
np.log(1 + df['ebit']),
np.log(1 - df['ebit']) * -1
请参阅本文。
np.log(1 - df['ebit'])
由于属于 的条件,因此该部分不可能为负ebit < 0
。
问题出在这块代码中:
在这里,您要计算 ebit 为正数和负数的两个公式,并将它们存储在 中
choices_ebit
。但是,当 ebit>=1 时,第二个公式会给您运行时警告,而当 ebit<=-1 时,第一个公式会给您运行时警告。为了避免计算两个公式,你可以将它们分解为一个,
abs()
一方面是,np.sign()
另一方面是:这满足您的要求:
np.log()
当您执行以下操作时,您会收到此错误,因为您传递了负值:和
我猜想这
* -1
部分是你试图避免传入负数,但是你在 log 函数之外执行此操作,因此出现错误。例如,如果1 - df['ebit'] = n
,你的代码首先尝试log(n)
将其乘以-1
。如果 n 为负数(就像你的代码中经常出现的那样),这是不可能的。您想要重写日志调用,使其
* -1
位于日志内部,例如:编辑感谢@Quang Hoang
使用:
是实现您所追求的更强大的方法,因为如果中的值小于 1 ,使用
* -1
仍然会导致负值问题。使用取列的绝对值,因此该值与符号无关,这将避免任何负值被传递到df['sale']
.abs()
np.log()