Aqui está um exemplo de dados, mesmo que não haja nenhum negativo ou np.nan, ele ainda mostra uma mensagem de erro:
Dados:
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
Função:
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
Correr
calculate_ln_values(data)
Aviso de erro:
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)
Eu ficaria muito grato se alguém pudesse me ajudar com essa questão
---- Editar: resposta à resposta de @Emi OB e @Quang Hoang: ---------------
A fórmula como no artigo é:
ln(1+EBIT) se EBIT ≥ 0
-ln(1-EBIT) se EBIT < 0
então meu código:
np.log(1 + df['ebit']),
np.log(1 - df['ebit']) * -1
segue o artigo.
A parte np.log(1 - df['ebit'])
é impossível de ser negativa, pois se enquadra na condição de ebit < 0
.
O problema está neste bloco de código:
Aqui, você está calculando ambas as fórmulas, para quando ebit é positivo e quando é negativo, e armazenando-as em
choices_ebit
. No entanto, quando ebit>=1, a segunda lhe dará o aviso de tempo de execução, e quando ebit<=-1, a primeira lhe dará o aviso de tempo de execução.Para evitar calcular ambas as fórmulas, você pode fatorá-las em uma só,
abs()
por um lado, enp.sign()
por outro:Isso atende às suas necessidades:
Você está recebendo esse erro porque está passando valores negativos
np.log()
ao fazer o seguinte:e
Imagino que a
* -1
parte era você tentando evitar passar um negativo, no entanto, você está fazendo isso fora da função log, daí o erro. Por exemplo, se1 - df['ebit'] = n
, seu código está primeiro tentando fazerlog(n)
then multiplique isso por-1
. Se n for negativo (como geralmente é em seu código), isso não é possível.Você quer reescrever suas chamadas de log de forma que elas
* -1
fiquem dentro do log, como:Editar graças a @Quang Hoang
Usando:
É uma maneira mais robusta de conseguir o que você quer, já que usar
* -1
ainda causará problemas com valores negativos se houver um valor emdf['sale']
que seja menor que 1. Usar.abs()
pega o valor absoluto de uma coluna, então o valor independentemente do sinal, o que evitará que quaisquer valores negativos sejam passados paranp.log()