вы можете использовать панд.Вы должны выбрать метод для обнаружения выбросов, но у меня есть пример для вас:
Если вы хотите получить выбросы для всех продаж (не в группах), вы можете использовать apply с функцией (пример - лямбда-функция)иметь индексы выбросов.
import numpy as np
%matplotlib inline
df = pd.DataFrame({'item_id': [1, 1, 2, 1, 2, 1, 2],
'sales': [0, 2, 30, 3, 30, 30, 55]})
df[df.apply(lambda x: np.abs(x.sales - df.sales.mean()) / df.sales.std() > 1, 1)
].set_index('item_id').plot(style='.', color='red')
В этом примере мы сгенерировали выборку данных и индексы поиска точек, которые больше, чем среднее значение / std + 1 (вы можете попробовать другой метод).А затем просто нанесите их на график, где у - количество продаж, а х - идентификатор товара.Этот метод обнаружил точки 0 и 55. Если вы хотите искать выбросы в группах, вы можете сгруппировать данные раньше.
df.groupby('item_id').apply(lambda data: data.loc[
data.apply(lambda x: np.abs(x.sales - data.sales.mean()) / data.sales.std() > 1, 1)
]).set_index('item_id').plot(style='.', color='red')
В этом примере у нас есть точки 30 и 55, потому что 0 не является выбросом для группы, гдеitem_id = 1, но 30 - это.
Это то, что вы хотите сделать?Надеюсь, это поможет начать с этого.