Estou trabalhando com dados de séries temporais nos quais estou tentando realizar a detecção de outliers usando o método IQR.
Dados de amostra:
import pandas as pd
import numpy as np
df = pd.DataFrame({'datecol' : pd.date_range('2024-1-1', '2024-12-31'),
'val' : np.random.random.randin(low = 100, high = 5000, size = 8366})
minha função:
def is_outlier(x):
iqr = x.quantile(.75) - x.quantile(.25)
outlier = (x <= x.quantile(.25) - 1.5*iqr) | (x >= x.quantile(.75) + 1.5*iqr)
return np.select([outlier], [1], 0)
df.groupby(df['datecol'].dt.weekday)['val'].apply(is_outlier)
para o qual a saída é algo como abaixo:
0 [1,1,0,0,....
1 [1,0,0,0,....
2 [1,1,0,0,....
3 [1,0,1,0,....
4 [1,1,0,0,....
5 [1,1,0,0,....
6 [1,0,0,1,....
Estou esperando uma única série como saída que eu possa adicionar de volta ao original dataframe
como uma coluna de sinalização.
Alguém pode me ajudar com isso?
Você deve usar
groupby.transform
, nãoapply
:Alternativamente, retorne explicitamente uma Série e use
group_keys=False
:Observe que com uma única condição,
np.where
deve ser preferido anp.select
.Você também pode usar uma abordagem vetorial com
groupby.quantile
:Saída: