我正在处理时间序列数据,其中我尝试使用 IQR 方法执行异常值检测。
样本数据:
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})
我的功能:
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)
输出如下:
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,....
我期待一个单一的系列作为输出,我可以将其添加回原始
dataframe
作为标志列。
有人可以帮我吗
groupby.transform
,而不是apply
:
df['flag'] = df.groupby(df['datecol'].dt.weekday)['val'].transform(is_outlier)
输出:
datecol val flag
0 2024-01-01 3193 0
1 2024-01-02 1044 0
2 2024-01-03 2963 0
3 2024-01-04 4448 0
4 2024-01-05 1286 0
.. ... ... ...
361 2024-12-27 1531 0
362 2024-12-28 4565 0
363 2024-12-29 3396 0
364 2024-12-30 1870 0
365 2024-12-31 3818 0