Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Substituindo Outliers por média de um DataFrame

Olá, bom dia a todos, quero fazer a previsão de vendas diárias de um banco de dados e preciso de ajuda =D. Como tenho poucos dados (562 dias) no meu exemplo não queria remover os outliers e sim substituir pela média de vendas diárias de um novo Dataframe 'dados_new' sem os outliers. Se remover os outliers perderei alguns dias de venda e a princípio não achei interessante. Gostaria de usar/aprender a usar o apply e criar uma função lambda para fazer alguma alteração nas linhas/colunas de acordo com alguma condição, acho que estou complicando as coisas rs , mas nesse caso preciso inserir a média dos valores do novo dataframe 'dados_new' nos dias que outliers foram identificados, e estou fazendo dessa forma:

#Criei um DataFrame 'dados_new' sem os outliers para testar se a seleção está ok e gerar uma média sem os outliers e funcionou, resultando em um DataFrame com 48 registros a menos e o valor seria 8040.39 de mean/média. obs: Usei a regra dos quartis para gerar os limites

selecao = (df['VENDA_DIA'] >= limite_inferior) & (df['VENDA_DIA'] <= limite_superior) dados_new = df[selecao]

Agora preciso inserir a média dos valores desse novo "dados_new" (dados_new["VENDA_DIA"].mean()) apenas nos dias que a venda total gerou um Outliers, tentei assim, não deu certo, gostaria de aprender a usar apply + lambda com alguma condição if, nesse caso tentei usar a condição da selecao:

df['VENDA_DIA'].apply(lambda x : dados_new['VENDA_DIA'].mean if (x['VENDA_DIA'] >= limite_inferior) & (x['VENDA_DIA'] <= limite_superior))

Mas retorna erro:

df['VENDA_DIA'].apply(lambda x : dados_new['VENDA_DIA'].mean if (x['VENDA_DIA'] >= limite_inferior) & (x['VENDA_DIA'] <= limite_superior)) ^ SyntaxError: invalid syntax

Tenho o df original com 562 registro e o dados_new sem outiliers com 514, preciso criar um DataFrame com os 562 linhas onde os valores outliers sejam substituídos pela média. Desde já agradeço a ajuda e paciência, muito obrigado e bora estudar.

2 respostas
solução!

Acredito que estão faltando algumas coisas:

1) Quando você seleciona uma coluna de um DataFrame, o resultado é uma Series. Ou seja, df['VENDA_DIA'] é uma Series.

E quando você usa apply em uma Series, você está aplicando em cada valor da série. Ou seja, dá erro ao acessar a coluna "VENDA_DIA" do x do seu lambda x, pois x não é um DataFrame e não tem colunas, x já é o próprio valor da venda.

2) Falta o parênteses para chamar "dados_new['VENDA_DIA'].mean". Assim sem parêntesis ele não vai retornar o resultado da média e sim a função média.

3) Definir o valor da lambda quando a condição do if não for verdadeira (incluir um else). Acredito que caso não seja um outlier você quer que mantenha o valor original, certo?

4) Acho que a condição do if está invertida.

Juntando todas as considerações ficaria assim:


df['VENDA_DIA'].apply(
    lambda x: dados_new['VENDA_DIA'].mean()
    if (x < limite_inferior) or (x > limite_superior)
    else x
)

Não tenho seus dados para testar, mas acho que isso deve ser próximo do que você precisa.

Obrigado.